枚举算法教案
㈠ 算法思想可以简单说一下吗
业界公认的常用算法思想有8种,分别是枚举、递推、递归、分治、贪心、试探法、动态迭代和模拟。当然8种只是一个大概的划分,是一个“仁者见仁、智者见智”的问题。
枚举算法思想
枚举算法思想的最大特点是,在面对任何问题时它会去尝试每一种解决方法。在进行归纳推理时,如果逐个考察了某类事件的所有可能情况,因而得出一般结论,那么这个结论是可靠的,这种归纳方法叫作枚举法。
枚举算法基础
枚举算法的思想是:将问题的所有可能的答案一一列举,然后根据条件判断此答案是否合适,保留合适的,丢弃不合适的。在C语言中,枚举算法一般使用while循环实现。使用枚举算法解题的基本思路如下。
① 确定枚举对象、枚举范围和判定条件。
② 逐一列举可能的解,验证每个解是否是问题的解。
枚举算法一般按照如下3个步骤进行。
① 题解的可能范围,不能遗漏任何一个真正解,也要避免有重复。
② 判断是否是真正解的方法。
③ 使可能解的范围降至最小,以便提高解决问题的效率。
㈡ 𨱒冧妇绠楁硶鏄浠涔
鏋氢妇绠楁硶鏄鎴戜滑鍦ㄦ棩甯镐腑浣跨敤鍒扮殑链澶氱殑涓涓绠楁硶锛屽畠镄勬牳蹇冩濇兂灏辨槸:鏋氢妇镓链夌殑鍙鑳斤纸绌蜂妇)鏋氢妇娉旷殑链璐ㄥ氨鏄浠庢墍链夊欓夌瓟妗堜腑铡绘悳绱㈡g‘镄勮В,浣跨敤璇ョ畻娉曢渶瑕佹弧瓒充袱涓𨱒′欢锛(1)鍙棰勫厛纭瀹氩欓夌瓟妗堢殑鏁伴噺锛(2)鍊欓夌瓟妗堢殑锣冨洿鍦ㄦ眰瑙d箣鍓嶅繀椤绘湁涓涓纭瀹氱殑闆嗗悎銆
㈢ 鏋氢妇娉曟槸浠涔
鍦ㄨ繘琛屽綊绾虫帹鐞嗘椂锛屽傛灉阃愪釜钥冨疗浜嗘煇绫讳簨浠剁殑镓链夊彲鑳芥儏鍐碉纴锲犺屽缑鍑轰竴鑸缁撹猴纴闾d箞杩欑粨璁烘槸鍙闱犵殑锛岃繖绉嶅綊绾虫柟娉曞彨锅氭灇涓炬硶锛 涓銆佺壒镣癸细灏嗛梾棰樼殑镓链夊彲鑳界殑绛旀堜竴涓鍒椾妇锛岀劧钖庢牴鎹𨱒′欢鍒ゆ柇姝ょ瓟妗堟槸钖﹀悎阃傦纴钖堥傚氨淇濈暀锛屼笉钖堥傚氨涓㈠纯銆备緥濡傦细 镓惧嚭1鍒100涔嬮棿镄绱犳暟銆傞渶瑕佸皢1鍒100涔嬮棿镄勬墍链夋暣鏁拌繘琛屽垽鏂銆 鏋氢妇绠楁硶锲犱负瑕佸垪涓鹃梾棰樼殑镓链夊彲鑳界殑绛旀堬纴镓链夊畠鍏峰囦互涓嫔嚑涓鐗圭偣锛 1銆佸缑鍒扮殑缁撴灉镶瀹氭槸姝g‘镄勶绂 2銆佸彲鑳藉仛浜嗗緢澶氱殑镞犵敤锷燂纴娴璐逛简瀹濊吹镄勬椂闂达纴鏁堢巼浣庝笅銆 3銆侀氩父浼氭秹鍙婂埌姹傛瀬鍊硷纸濡傛渶澶э纴链灏忥纴链閲岖瓑锛夈 浜屻佹灇涓剧畻娉旷殑涓鑸缁撴瀯锛归hile寰鐜銆 棣栧厛钥冭槛涓涓闂棰桡细灏1鍒100涔嬮棿镄勬墍链夋暣鏁拌浆鎹涓浜岃繘鍒舵暟琛ㄧず銆 绠楁硶涓锛 for i:=1 to 100 do begin 灏唅杞鎹涓轰簩杩涘埗锛岄噰鐢ㄤ笉鏂闄や互2锛屼綑鏁板嵆涓鸿浆鎹涓2杩涘埗浠ュ悗镄勭粨鏋溿备竴鐩撮櫎鍟嗕负0涓烘銆 end; 绠楁硶浜岋细浜岃繘鍒跺姞娉曪纴姝ゆ椂闇瑕佹暟缁勬潵甯蹇欍 program p; var a:array[1..100] of integer; {鐢ㄤ簬淇濆瓨杞鎹㈠悗镄勪簩杩涘埗缁撴灉} i,j,k:integer; begin fillchar(a,sizeof(a),0); {100涓鏁扮粍鍏幂礌鍏ㄩ儴鍒濆嫔寲涓0} for i:=1 to 100 do begin k:=100; while a[k]=1 do dec(k); {镓鹃珮浣岖涓涓涓0镄勪綅缃畗 a[k]:=1; {镓惧埌浜嗙珛鍒昏祴鍊间负1} for j:=k+1 to 100 do a[j]:=0; {瀹冨悗闱㈢殑浣庝綅鍏ㄩ儴璧嫔间负0} k:=1; while a[k]=0 do inc(k); {浠庢渶楂树綅寮濮嬫垒涓崭负0镄勪綅缃畗 write('(',i,')2='); for j:=k to 100 do write(a[j]); {杈揿嚭杞鎹浠ュ悗镄勭粨鏋渳 writeln; end; end. 鏋氢妇娉曪纴甯稿父绉颁箣涓虹┓涓炬硶锛屾槸鎸囦粠鍙鑳界殑闆嗗悎涓涓涓鏋氢妇钖勪釜鍏幂礌锛岀敤棰樼洰缁椤畾镄勭害𨱒熸浔浠跺垽瀹氩摢浜涙槸镞犵敤镄勶纴鍝浜涙槸链夌敤镄勚傝兘浣垮懡棰樻垚绔嬭咃纴鍗充负闂棰樼殑瑙c 閲囩敤鏋氢妇绠楁硶瑙i樼殑锘烘湰镐濊矾锛 锛1锛 纭瀹氭灇涓惧硅薄銆佹灇涓捐寖锲村拰鍒ゅ畾𨱒′欢锛 锛2锛 涓涓鏋氢妇鍙鑳界殑瑙o纴楠岃瘉鏄钖︽槸闂棰樼殑瑙 涓嬮溃鎴戜滑灏变粠鏋氢妇绠楁硶镄勭殑浼桦寲銆佹灇涓惧硅薄镄勯夋嫨浠ュ强鍒ゅ畾𨱒′欢镄勭‘瀹氾纴杩欎笁涓鏂归溃𨱒ユ帰璁ㄥ备綍鐢ㄦ灇涓炬硶瑙i樸 渚1锛氱栌阍变拱锏鹃浮闂棰桡细链変竴涓浜烘湁涓锏惧潡阍憋纴镓撶畻涔颁竴锏惧彧楦°傚埌甯傚満涓鐪嬶纴澶ч浮涓夊潡阍变竴鍙锛屽皬楦′竴鍧楅挶涓夊彧锛屼笉澶т笉灏忕殑楦′袱鍧楅挶涓鍙銆傜幇鍦锛岃蜂綘缂栦竴绋嫔簭锛屽府浠栬″垝涓涓嬶纴镐庝箞镙蜂拱娉曪纴镓嶈兘鍒氩ソ鐢ㄤ竴锏惧潡阍变拱涓锏惧彧楦★纻 绠楁硶鍒嗘瀽锛氭ら桦緢鏄剧劧鏄鐢ㄦ灇涓炬硶锛屾垜浠浠ヤ笁绉嶉浮镄勪釜鏁颁负鏋氢妇瀵硅薄锛埚垎鍒璁句负x,y,z锛,浠ヤ笁绉嶉浮镄勬绘暟锛坸+y+z锛夊拰涔伴浮鐢ㄥ幓镄勯挶镄勬绘暟(x*3+y*2+z)涓哄垽瀹氭浔浠讹纴绌蜂妇钖勭嶉浮镄勪釜鏁般 涓嬮溃鏄瑙h繖涓锏鹃浮闂棰樼殑绋嫔簭 var x,y,z:integer; begin for x:=0 to 100 do for y:=0 to 100 do for z:=0 to 100 do{鏋氢妇镓链夊彲鑳界殑瑙} if (x+y+z=100)and(x*3+y*2+z div 3=100)and(z mod 3=0)then writeln('x=',x,'y=',y,'z=',z); {楠岃瘉鍙鑳界殑瑙o纴骞惰緭鍑虹﹀悎棰樼洰瑕佹眰镄勮В} end. 涓婇溃镄勬浔浠惰缮链変紭鍖栫殑绌洪棿锛屼笁绉嶉浮镄勫拰鏄锲哄畾镄勶纴鎴戜滑鍙瑕佹灇涓句簩绉嶉浮锛坸,y锛夛纴绗涓夌嶉浮灏卞彲浠ユ牴鎹绾︽潫𨱒′欢姹傚缑锛坺=100-x-y锛夛纴杩欐牱灏辩缉灏忎简鏋氢妇锣冨洿锛岃风湅涓嬮溃镄勭▼搴忥细 var x,y,z:integer; begin for x:=0 to 100 do for y:=0 to 100-x do begin z:=100-x-y; if (x*3+y*2+z div 3=100)and(z mod 3=0)then writeln('x=',x,'y=',y,'z=',z); end; end. 链缁忎紭鍖栫殑绋嫔簭寰鐜浜1013 娆★纴镞堕棿澶嶆潅搴︿负O(n3)锛涗紭鍖栧悗镄勭▼搴忓彧寰鐜浜嗭纸102*101/2锛夋 锛屾椂闂村嶆潅搴︿负O(n2)銆备粠涓婇溃镄勫规瘆鍙浠ョ湅鍑猴纴瀵逛簬鏋氢妇绠楁硶锛屽姞寮虹害𨱒熸浔浠讹纴缂╁皬鏋氢妇镄勮寖锲达纴鏄绋嫔簭浼桦寲镄勪富瑕佽冭槛鏂瑰悜銆 鍦ㄦ灇涓剧畻娉曚腑锛屾灇涓惧硅薄镄勯夋嫨涔熸槸闱炲父閲嶈佺殑锛屽畠鐩存帴褰卞搷镌绠楁硶镄勬椂闂村嶆潅搴︼纴阃夋嫨阃傚綋镄勬灇涓惧硅薄鍙浠ヨ幏寰楁洿楂樼殑鏁堢巼銆傚备笅渚嬶细 渚2銆佸皢1,2...9鍏9涓鏁板垎鎴愪笁缁,鍒嗗埆缁勬垚涓変釜涓変綅鏁,涓斾娇杩欎笁涓涓変綅鏁版瀯鎴1:2:3镄勬瘆渚,璇曟眰鍑烘墍链夋弧瓒虫浔浠剁殑涓変釜涓変綅鏁. 渚嫔:涓変釜涓変綅鏁192,384,576婊¤冻浠ヤ笂𨱒′欢.(NOIP1998pj) 绠楁硶鍒嗘瀽锛氲繖鏄1998骞村叏锲藉垎鍖鸿仈璧涙櫘鍙婄粍璇曢桡纸绠绉癗OIP1998pj锛屼互涓嫔悓锛夈傛ら樻暟鎹瑙勬ā涓嶅ぇ锛屽彲浠ヨ繘琛屾灇涓撅纴濡傛灉鎴戜滑涓嶅姞镐濆湴浠ユ疮涓涓鏁颁綅涓烘灇涓惧硅薄锛屼竴浣崭竴浣嶅湴铡绘灇涓撅细 for a:=1 to 9 do for b:=1 to 9 do 钬︹︹ for i:=1 to 9 do 杩欐牱涓嫔幓锛屾灇涓炬℃暟灏辨湁99娆★纴濡傛灉鎴戜滑鍒嗗埆璁句笁涓鏁颁负x,2x,3x锛屼互x涓烘灇涓惧硅薄锛岀┓涓剧殑锣冨洿灏卞噺灏戜负93锛屽湪缁呜妭涓婂啀杩涗竴姝ヤ紭鍖栵纴鏋氢妇锣冨洿灏辨洿灏戜简銆傜▼搴忓备笅锛 var t,x:integer; s,st:string; c:char; begin for x:=123 to 321 do{鏋氢妇镓链夊彲鑳界殑瑙} begin t:=0; str(x,st);{鎶婃暣鏁皒杞鍖栦负瀛楃︿覆锛屽瓨鏀惧湪st涓瓆 str(x*2,s); st:=st+s; str(x*3,s); st:=st+s; for c:='1' to '9' do{鏋氢妇9涓瀛楃︼纴鍒ゆ柇鏄钖﹂兘鍦╯t涓瓆 if pos(c,st)<>0 then inc(t) else break;{濡傛灉涓嶅湪st涓锛屽垯阃鍑哄惊鐜瘆 if t=9 then writeln(x,' ',x*2,' ',x*3); end; end. 鍦ㄦ灇涓炬硶瑙i树腑锛屽垽瀹氭浔浠剁殑纭瀹氢篃鏄寰堥吨瑕佺殑锛屽傛灉绾︽潫𨱒′欢涓嶅规垨钥呬笉鍏ㄩ溃锛屽氨绌蜂妇涓嶅嚭姝g‘镄勭粨鏋滐纴 鎴戜滑鍐岖湅鐪嬩笅闱㈢殑渚嫔瓙銆 渚3 涓鍏冧笁娆℃柟绋嬫眰瑙(noip2001tg) 闂棰樻弿杩 链夊舰濡傦细ax3+bx2+cx+d=0 杩欐牱镄勪竴涓涓鍏冧笁娆℃柟绋嬨傜粰鍑鸿ユ柟绋嬩腑钖勯”镄勭郴鏁(a锛宐锛宑锛宒 鍧囦负瀹炴暟)锛屽苟绾﹀畾璇ユ柟绋嫔瓨鍦ㄤ笁涓涓嶅悓瀹炴牴(镙圭殑锣冨洿鍦-100镊100涔嬮棿)锛屼笖镙逛笌镙逛箣宸镄缁濆瑰>=1銆 瑕佹眰鐢卞皬鍒板ぇ渚濇″湪钖屼竴琛岃緭鍑鸿繖涓変釜瀹炴牴(镙逛笌镙逛箣闂寸暀链夌┖镙)锛屽苟绮剧‘鍒板皬鏁扮偣钖2浣嶃 鎻愮ず锛氲版柟绋媐(x)=0锛岃嫢瀛桦湪2涓鏁皒1鍜寈2锛屼笖x1<x2锛宖(x1)*(x2)<0锛屽垯鍦(x1锛寈2)涔嬮棿涓瀹氭湁涓涓镙广 镙蜂緥 杈揿叆锛1 -5 -4 20 杈揿嚭锛-2.00 2.00 5.00 绠楁硶鍒嗘瀽锛氱敱棰樼洰镄勬彁绀哄緢绗﹀悎浜屽垎娉曟眰瑙g殑铡熺悊锛屾墍浠ユら桦彲浠ョ敤浜屽垎娉曘傜敤浜屽垎娉曡В棰樼浉瀵逛簬鏋氢妇娉曟潵璇村緢瑕佸嶆潅寰埚氥傛ら樻槸钖﹁兘鐢ㄦ灇涓炬硶姹傝В锻锛熷啀鍒嗘瀽涓涓嬮樼洰锛屾牴镄勮寖锲村湪-100鍒100涔嬮棿锛岀粨鏋滃彧瑕佷缭鐣欎袱浣嶅皬鏁帮纴鎴戜滑涓嶅Θ灏嗘牴镄鍊煎烟镓╁ぇ100鍊嶏纸-10000<=x<=10000锛夛纴鍐崭互镙逛负鏋氢妇瀵硅薄锛屾灇涓捐寖锲存槸-10000鍒10000锛岀敤铡熸柟绋嫔纺杩涜屼竴涓楠岃瘉锛屾垒鍑烘柟绋嬬殑瑙c 链夌殑钖屽﹀湪姣旇禌涓鏄杩欐牱锅 var k:integer; a,b,c,d,x :real; begin read(a,b,c,d); for k:=-10000 to 10000 do begin x:=k/100; if a*x*x*x+b*x*x+c*x+d=0 then write(x:0:2,' '); end; end. 鐢ㄨ繖绉嶆柟娉曪纴寰埚揩灏卞彲浠ユ妸绋嫔簭缂栧嚭𨱒ワ纴鍐嶅皢镙蜂緥鏁版嵁浠e叆娴嬭瘯涔熸槸瀵圭殑锛岀瓑鎴愮哗涓嬫潵镓嶅彂鐜拌繖棰樻病链夊叏瀵癸纴鍙寰椾简涓鍗婄殑鍒嗐 杩欑嶈В娉曚负浠涔堟槸阌欑殑锻锛熼敊鍦ㄥ摢閲岋纻鍓嶉溃镄勫垎鏋愬ソ璞′篃娌¢敊鍟婏纴闅鹃亾杩欓树笉鑳界敤鏋氢妇娉曞仛钖楋纻 鐪嫔埌杩欓噷澶у跺彲鑳芥湁镣硅糠𨱍戜简銆 鍦ㄤ笂闱㈢殑瑙f硶涓锛屾灇涓捐寖锲村拰鏋氢妇瀵硅薄閮芥病链夐敊锛岃屾槸鍦ㄩ獙璇佹灇涓剧粨鏋沧椂锛屽垽瀹氭浔浠剁敤阌欎简銆傚洜涓鸿佷缭鐣欎簩浣嶅皬鏁帮纴镓浠ユ眰鍑烘潵镄勮В涓崭竴瀹氭槸鏂圭▼镄勭簿纭镙癸纴鍐崭唬鍏ax3+bx2+cx+d涓锛屾墍寰楃殑缁撴灉涔熷氨涓崭竴瀹氱瓑浜0锛屽洜姝ょ敤铡熸柟绋媋x3+bx2+cx+d=0浣滀负鍒ゆ柇𨱒′欢鏄涓嶅嗳纭镄勚 鎴戜滑鎹涓涓瑙掑害𨱒ユ濊冮梾棰桡纴璁緁(x)=ax3+bx2+cx+d锛岃嫢x涓烘柟绋嬬殑镙癸纴鍒欐牴鎹鎻愮ず鍙鐭ワ纴蹇呮湁f(x-0.005)*(x+0.005)<0锛屽傛灉鎴戜滑浠ユや负鏋氢妇鍒ゅ畾𨱒′欢锛岄梾棰桦氨阃嗗垉钥岃В銆傚彟澶栵纴濡傛灉f(x-0.005)=0锛屽摢涔埚氨璇存槑x-0.005鏄鏂圭▼镄勬牴锛岃繖镞舵牴鎹锲涜垗5鍏ワ纴鏂圭▼镄勬牴涔熶负x銆傛墍浠ユ垜浠鐢(f(x-0.005)*f(x+0.005)<0) 鍜 (f(x-0.005)=0)浣滀负鍒ゅ畾𨱒′欢銆备负浜嗙▼搴忚捐$殑鏂逛究锛屾垜浠璁捐′竴涓鍑芥暟f(x)璁$畻ax3+bx2+cx+d镄勫硷纴绋嫔簭濡备笅锛 {$N+} var k:integer; a,b,c,d,x:extended; function f(x:extended):extended; {璁$畻ax3+bx2+cx+d镄勫紏 begin f:=((a*x+b)*x+c)*x+d; end; begin read(a,b,c,d); for k:=-10000 to 10000 do begin x:=k/100; if (f(x-0.005)*f(x+0.005)<0) or (f(x-0.005)=0) then write(x:0:2,' '); {鑻x涓ょ镄勫嚱鏁板煎纾鍙锋垨x-0.005鍒氩ソ鏄鏂圭▼镄勬牴锛屽垯纭瀹歺涓烘柟绋嬬殑镙箎 end; end. 鐢ㄦ灇涓炬硶瑙i樼殑链澶х殑缂虹偣鏄杩愮畻閲忔瘆杈冨ぇ锛岃В棰樻晥鐜囦笉楂桡纴濡傛灉鏋氢妇锣冨洿澶澶э纸涓鑸浠ヤ笉瓒呰繃涓ょ栌涓囨′负闄愶级锛屽湪镞堕棿涓婂氨闅句互镓垮弹銆备絾鏋氢妇绠楁硶镄勬濊矾绠鍗曪纴绋嫔簭缂栧啓鍜岃皟璇曟柟渚匡纴姣旇禌镞朵篃瀹规槗𨱍冲埌锛屽湪绔炶禌涓锛屾椂闂存槸链夐檺镄勶纴鎴戜滑绔炶禌镄勬渶缁堢洰镙囧氨鏄姹傚嚭闂棰樿В锛屽洜姝わ纴濡傛灉棰樼洰镄勮勬ā涓嶆槸寰埚ぇ锛屽湪瑙勫畾镄勬椂闂翠笌绌洪棿闄愬埗鍐呰兘澶熸眰鍑鸿В锛岄偅涔堟垜浠链濂芥槸閲囩敤鏋氢妇娉曪纴钥屼笉闇澶鍦ㄦ剰鏄钖﹁缮链夋洿蹇镄勭畻娉曪纴杩欐牱鍙浠ヤ娇浣犳湁镟村氱殑镞堕棿铡昏В绛斿叾浠栭毦棰