窮舉法 列舉法

2021-06-27 23:15:03 字數 1701 閱讀 8234

列舉法,常常稱之為窮舉法,是指從可能的集合中一一枚舉各個元素,用題目給定的約束條件判定哪些是無用的,哪些是有用的。能使命題成立者,即為問題的解。

採用列舉演算法解題的基本思路:

(1)    確定列舉物件、列舉範圍和判定條件;

(2)    一一枚舉可能的解,驗證是否是問題的解

下面我們就從列舉演算法的的優化、列舉物件的選擇以及判定條件的確定,這三個方面來**如何用列舉法解題。

例1:百錢買百雞問題:有乙個人有一百塊錢,打算買一百隻雞。到市場一看,大雞三塊錢乙隻,小雞一塊錢三隻,不大不小的雞兩塊錢乙隻。現在,請你編一程式,幫他計畫一下,怎麼樣買法,才能剛好用一百塊錢買一百隻雞?

演算法分析:此題很顯然是用列舉法,我們以三種雞的個數為列舉物件(分別設為x,y,z),以三種雞的總數(x+y+z)和買雞用去的錢的總數(x*3+y*2+z)為判定條件,窮舉各種雞的個數。

下面是解這個百雞問題的程式

[cpp]view plain

copy

for(

intx=0;x<10;x++)  

for(

inty=0;y<10;y++)  

for(

intz=0;z<10;)    

上面的條件還有優化的空間,三種雞的和是固定的,我們只要列舉二種雞(x,y),第三種雞就可以根據約束條件求得(z=100-x-y),這樣就縮小了列舉範圍,請看下面的程式:

[cpp]view plain

copy

for(

intx=0;x<100;x++)  

for(

inty=0;y<100;y++)  

}  

程式迴圈了1013 次,時間複雜度為o(n3);優化後的程式只迴圈了(102*101/2)次 ,時間複雜度為o(n2)。從上面的對比可以看出,對於列舉演算法,加強約束條件,縮小列舉的範圍,是程式優化的主要考慮方向。

例2、將1,2...9共9個數分成三組,分別組成三個三位數,且使這三個三位數構成1:2:3的比例,試求出所有滿足條件的三個三位數.

例如:三個三位數192,384,576滿足以上條件.(noip1998pj)

演算法分析:這是2023年全國分割槽聯賽普及組試題(簡稱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,在細節上再進一步優化,列舉範圍就更少了。程式如下:

vart,x:integer;

s,st:string;

c:char;

begin

for x:=123 to 321 do

begin

t:=0;

str(x,st);

str(x*2,s); st:=st+s;

str(x*3,s); st:=st+s;

for c:='1' to '9' do

if pos(c,st)<>0 then inc(t) else break;

if t=9 then   writeln(x,' ',x*2,' ',x*3);

end;

end.

窮舉法重點知識列舉

1窮舉法也叫做列舉法 舉例子 2質數又稱作素數,有無數個 3窮舉法特點 1,確定窮舉的範圍 2,判斷每個可能的值是否符合我們需要的條件 4指數定義在大於1的自然數當中,除了一和她本身之外不再有其他因數,換句話說,只能被一和他自己整除 5使用窮舉法來求素數 1明確乙個範圍,在什麼範圍內的素數 2,符合...

C語言窮舉法

使用c語言窮舉法解決求總值問題。1 乙隻猴子採摘了一堆蘋果,第一天吃一半的蘋果,猴子覺得還不夠,於是再吃了乙個。第二天也是這樣。一直到吃了九天,第十天就只剩下乙個了。請問猴子一共採摘了多少蘋果。分析 解決此類問題有兩個方法。一種就是我們較為容易想到的逆推法。還有一種就是窮舉法。逆推法 include...

窮舉法演算法練習

answer include include double a,b,c,d void sort num intmain 注意使用pow書寫冪函式 注意輸出條件 空格隔開,及最後乙個輸出數值後面不能加空格。因為該題輸出的個數有限,以上是乙個簡單方法。還可以使用c 的陣列進行操作。include ios...