⑴ 枚舉法是什麼
在進行歸納推理時,如果逐個考察了某類事件的所有可能情況,因而得出一般結論,那麼這結論是可靠的,這種歸納方法叫做枚舉法. 一、特點:將問題的所有可能的答案一一列舉,然後根據條件判斷此答案是否合適,合適就保留,不合適就丟棄。例如: 找出1到100之間的素數。需要將1到100之間的所有整數進行判斷。 枚舉演算法因為要列舉問題的所有可能的答案,所有它具備以下幾個特點: 1、得到的結果肯定是正確的; 2、可能做了很多的無用功,浪費了寶貴的時間,效率低下。 3、通常會涉及到求極值(如最大,最小,最重等)。 二、枚舉演算法的一般結構:while循環。 首先考慮一個問題:將1到100之間的所有整數轉換為二進制數表示。 演算法一: for i:=1 to 100 do begin 將i轉換為二進制,採用不斷除以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. 枚舉法,常常稱之為窮舉法,是指從可能的集合中一一枚舉各個元素,用題目給定的約束條件判定哪些是無用的,哪些是有用的。能使命題成立者,即為問題的解。 採用枚舉演算法解題的基本思路: (1) 確定枚舉對象、枚舉范圍和判定條件; (2) 一一枚舉可能的解,驗證是否是問題的解 下面我們就從枚舉演算法的的優化、枚舉對象的選擇以及判定條件的確定,這三個方面來探討如何用枚舉法解題。 例1:百錢買百雞問題:有一個人有一百塊錢,打算買一百隻雞。到市場一看,大雞三塊錢一隻,小雞一塊錢三隻,不大不小的雞兩塊錢一隻。現在,請你編一程序,幫他計劃一下,怎麼樣買法,才能剛好用一百塊錢買一百隻雞? 演算法分析:此題很顯然是用枚舉法,我們以三種雞的個數為枚舉對象(分別設為x,y,z),以三種雞的總數(x+y+z)和買雞用去的錢的總數(x*3+y*2+z)為判定條件,窮舉各種雞的個數。 下面是解這個百雞問題的程序 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); {驗證可能的解,並輸出符合題目要求的解} end. 上面的條件還有優化的空間,三種雞的和是固定的,我們只要枚舉二種雞(x,y),第三種雞就可以根據約束條件求得(z=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年全國分區聯賽普及組試題(簡稱NOIP1998pj,以下同)。此題數據規模不大,可以進行枚舉,如果我們不加思地以每一個數位為枚舉對象,一位一位地去枚舉: 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);{把整數x轉化為字元串,存放在st中} str(x*2,s); st:=st+s; str(x*3,s); st:=st+s; for c:='1' to '9' do{枚舉9個字元,判斷是否都在st中} if pos(c,st)<>0 then inc(t) else break;{如果不在st中,則退出循環} if t=9 then writeln(x,' ',x*2,' ',x*3); end; end. 在枚舉法解題中,判定條件的確定也是很重要的,如果約束條件不對或者不全面,就窮舉不出正確的結果, 我們再看看下面的例子。 例3 一元三次方程求解(noip2001tg) 問題描述 有形如:ax3+bx2+cx+d=0 這樣的一個一元三次方程。給出該方程中各項的系數(a,b,c,d 均為實數),並約定該方程存在三個不同實根(根的范圍在-100至100之間),且根與根之差的絕對值>=1。 要求由小到大依次在同一行輸出這三個實根(根與根之間留有空格),並精確到小數點後2位。 提示:記方程f(x)=0,若存在2個數x1和x2,且x1<x2,f(x1)*(x2)<0,則在(x1,x2)之間一定有一個根。 樣例 輸入:1 -5 -4 20 輸出:-2.00 2.00 5.00 演算法分析:由題目的提示很符合二分法求解的原理,所以此題可以用二分法。用二分法解題相對於枚舉法來說很要復雜很多。此題是否能用枚舉法求解呢?再分析一下題目,根的范圍在-100到100之間,結果只要保留兩位小數,我們不妨將根的值域擴大100倍(-10000<=x<=10000),再以根為枚舉對象,枚舉范圍是-10000到10000,用原方程式進行一一驗證,找出方程的解。 有的同學在比賽中是這樣做 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. 用這種方法,很快就可以把程序編出來,再將樣例數據代入測試也是對的,等成績下來才發現這題沒有全對,只得了一半的分。 這種解法為什麼是錯的呢?錯在哪裡?前面的分析好象也沒錯啊,難道這題不能用枚舉法做嗎? 看到這里大家可能有點迷惑了。 在上面的解法中,枚舉范圍和枚舉對象都沒有錯,而是在驗證枚舉結果時,判定條件用錯了。因為要保留二位小數,所以求出來的解不一定是方程的精確根,再代入ax3+bx2+cx+d中,所得的結果也就不一定等於0,因此用原方程ax3+bx2+cx+d=0作為判斷條件是不準確的。 我們換一個角度來思考問題,設f(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剛好是方程的根,則確定x為方程的根} end; end. 用枚舉法解題的最大的缺點是運算量比較大,解題效率不高,如果枚舉范圍太大(一般以不超過兩百萬次為限),在時間上就難以承受。但枚舉演算法的思路簡單,程序編寫和調試方便,比賽時也容易想到,在競賽中,時間是有限的,我們競賽的最終目標就是求出問題解,因此,如果題目的規模不是很大,在規定的時間與空間限制內能夠求出解,那麼我們最好是採用枚舉法,而不需太在意是否還有更快的演算法,這樣可以使你有更多的時間去解答其他難題
⑵ 用窮舉法求解問題的基本過程
1.If語句和For語句
If語句在窮舉演算法中一般用塊結構居多,形式為:If條件Then
Else語句可以沒有
End If
For語句結構形式為:
For循環變數=初值To終值Step步長
循環體語句
Next循環變數
3.窮舉演算法的應用
(1)使用窮舉演算法時,可能解的范圍是非常明確的,可能解的個數也是有限的,否則無法用此演算法。
(2)窮舉演算法應用舉例:猜密碼、尋找有特定要求的數字、最優方案等。
⑶ 計算機演算法什麼是窮舉法
顧名思義,窮舉法就是通過把需要解決問題的所有可能情況逐一試驗來找出符合條件的解的方法,對於許多毫無規律的問題而言,窮舉法用時間上的犧牲換來了解的全面性保證,尤其是隨著計算機運算速度的飛速發展,窮舉法的形象已經不再是最低等和原始的無奈之舉,比如經常有黑客在幾乎沒有任何已知信息的情況下利用窮舉法來破譯密碼,足見這種方法還是有其適用的領域的。可是,在蠢御渣實際生活中,只有很少的一些問題是真正意義上的「毫無規律」,其餘的大多數仍有內拆腔在規律可循,對於這些問題帶悄,使用窮舉法在效率上就顯得比較低下,而在一些對速度要求較高的區域和規模較大的問題上,效率的低下往往是致命的。
⑷ 窮舉法是什麼,有什麼用,怎麼計算
窮舉法又稱列舉法、枚舉法,是蠻力策略的具體體現,是一種簡單而直接地解決問題的方法。其基本思想是逐一列舉問題所涉及的所有情形,並根據問題提出的條件檢驗哪些是問題的解,哪些應予排除。
窮舉的作用
1、理論上,窮舉可以解決可計算領域中的各種問題。尤其處在計算機計算速度非常高的今天,窮舉的應用領域是非常廣闊的。
2、 在實際應用中,通常做枝要解決的問題規模不大,用窮舉設計的演算法其運算速度是可以接受的。此時,設計一個更高效率的演算法代價不值得。
3、 窮舉可作為某類問題時間性能的底限,用來衡量同樣問題的更高效率的演算法。
窮舉怎麼計算:
1、根據問題的具體情況確定窮舉量(簡單變數或數組);
2、根據確定的范圍設置窮舉循環;
3、根據問題的具體要求確定篩選約束條件;
4、設計窮舉程序並運行、調試,對運行結果進行分析與討論。 當問題所涉及數量非常大時,窮舉的工作量也就相應較大,程序運行時間也就相應較長。為此,應用窮舉求解時,應根據問題的具體情況分析歸納,尋找簡化規律,精簡窮舉循環,優化窮舉策略。
(4)窮舉法演算法判斷結婚對象擴展閱讀:
窮舉法的基本思想是根據題目的部分條件確定答案的大致范圍,並在此范圍內對所有可能的情況逐一驗證,直到全部情況驗證完畢。若某個情況驗證符合題目的全部條件,則為本問題的一個解;純戚敏若全部情況驗證後都不符合題目的全部條件,則本題無解。窮舉法也稱為枚舉法。
用窮舉法解題時,就是按照某種方式列舉問題答案的過程。針對問題的數據類型而言,常用的列舉方法一有如下三種:
(1)順序列舉 是指答案范圍內的各種情況很容易與自然數對應甚至就是自然數,可以按自然數的變化順序去列舉。
(2)排列列舉 有時答案的數據形式是一組數的排列,列舉出所有答案所在范圍內的排列,為排列列舉。
(3)組合列舉 當答案的數據形式為一些元素的組合時,往往需要仔團用組合列舉。組合是無序的。
參考資料:網路-窮舉法
⑸ 窮舉法是什麼
問題一:窮舉法是什麼,有什麼用,怎麼計算? 窮舉法是最常見的密碼破解方法。也就是一個一個地試。如比密碼為123,窮舉法從1位數0開始,一直到碰對為止。
一般來說,窮舉法適用於6位以下純數字密碼,超過6位數或較復雜窮舉法就很難了,即使可以,也需要很長時間。
問題二:什麼是窮舉法? 也叫枚舉法,把所有的情況都羅列出來!相對於歸納法。
問題三:在破解密碼時候通常有種方法叫窮舉法,什麼意思?! 窮舉法,樓上已經說過.
比如你的密碼是搭咐 123.
然後,用窮舉法,就要從001,002,003,004..激.一直到正確為止.雖然很慢,卻有效果.
另外有人提到了 字典法.
一個HACKER有一本好的字典很重要.
字典包括人名,單詞,常用字等等.比如:jack, iloveyou,520520,12345678等等等...
還有,邏輯法.
例如: 生日.電話號碼等..
類似: 19800808,19821212等...
身份證號碼:XXXXXXXXXXXXXXX
電話號碼:130*******,139*******等等..
還有,猜測法.
這個方法比較適合熟人..比如你的女朋友,公司或知賀純者朋友.
例如:生日,電話號碼,特定單詞等等...
問題四:窮舉法的基本思想是什麼? 窮舉也叫枚舉,它的基本觸想是先依據題目的部分條件來確定答案的大致范圍(可能解),然後在此范圍內用其餘的條件對所有可能解進行一一驗證,刪去那些不符合條件的解,剩下符合條件的解就是整個問題的解。
問題五:什麼叫窮舉法技術破解密碼有的會用「窮舉法」可以 窮舉法就是用無數的密碼組合不斷的去試,窮舉法破解的成功率取決於你的密碼字典,和計算機運行速度。
問題六:窮舉演算法是什麼(計算機) 給你個例子 窮舉法-6、7、8組成的數字
#include
main()
{
int high,mid,low;依次記錄最高位、中間位、最低位數字
int count=0;
printf(5、6、7可拍滾組成的且各位數字互不相同的數有:\n) ;
for(high=5;high
⑹ 基本演算法思想之窮舉法
窮舉演算法是最基本的演算法思想,我們通過一個簡單的例子來看看窮舉演算法的應用。雞兔同籠問題:
通過分析我們可以知道雞的數量應該為0~35之間的數。這樣,我們可以使用窮舉法來逐個判斷是否符合,從而搜索答案。
⑺ 常見演算法思想1:枚舉法
枚舉演算法的思想是:將問題的所有可能的答案一一列舉,然後根據條件判斷此答案是否合適,保留合適的,丟棄不合適的。
(1)確定枚舉對象、枚舉范圍和判定條件。
(2)逐一枚舉可能的解,驗證每個解是否是問題的解。陵兄
(1)題解的可能范圍,不能遺漏任何一滑汪灶個真正解,也要避免有重復。
(2)判斷是否是真正解的方法。
(3)使可能解的范圍降至最小,以便提高解決問題的效率。
在任何情況下,都需要選准最合信扮適的對象,無論是枚舉還是其他演算法思想,這是最關鍵的。選准(枚舉)對象的根本原因在於優化,具體表現為減少求解步驟,縮小求解的解空間,或者是使程序更具有可讀性和易於編寫。有時候選好了枚舉對象,確定了枚舉思想解決問題,問題就迎刃而解了。有的時候,當題目逼著你用枚舉思想解題時,需要考慮的往往是從眾多枚舉對象中選擇最適合的,這需要辨別的智慧。
運用枚舉思想思考時需要面對如下表的問題:
運行結果:
⑻ 什麼叫窮舉法有誰知道什麼叫窮舉演算法,VB可以
窮舉法就是用程序把所有的可能都列舉一遍,找出其中滿足條件的可能。
⑼ 什麼是窮舉演算法
簡單地說就是用最笨的方法把可能出現的情況一一嘗試一邊,直到對為止。
窮舉法
,或稱為
暴力破解法
,是一種針對於密碼的破譯方法,即將密碼進行逐個推算直到找出真正的密碼為止。例如一個已知是四位並且全部由數字組成的密碼,其可能共有10000種組合,因此最多嘗試10000次就能找到正確的密碼。理論上利用這種方法可以破解任何一種密碼,問題只在於如何縮短試誤時間。有些人運用計算機來增加效率,有些人輔以字典來縮小密碼組合的范圍。