演算法與資料結構 2 列舉

2022-03-05 11:24:21 字數 4159 閱讀 5618

列舉法又稱窮舉法,它是根據題意,列舉所有可能狀態,並用問題給定的條件來約束狀態,檢驗哪些是需要的,哪些是不需要的。迴圈+判斷語句,列舉幾個變數就迴圈幾次

設ai1—狀態元素ai的最小值;aik—狀態元素ai的最大值(1

≤i≤n),即a11≤a1≤a1k,a21≤a2≤a2k, ai1≤ai≤aik,

……,an1≤an≤ank

for(a1=a11;a1<=a1k;a1++)

for(a2=a21;a2<=a2k;a2++)

.....

for(ai=ai1;ai<=aik;ai++)

.....

for(an=an1;an<=ank;an++)

if(狀態(a1,...,ai...,an)滿足檢驗條件)

輸出問題的解;

a、縮小列舉範圍

b、減少列舉變數

c、使用其它演算法弄清楚列舉變數、列舉範圍、列舉判斷條件,敲**就非常簡單,而且不容易出錯了

列舉變數:

列舉範圍:

列舉判斷條件:

1/*2

3列舉變數:公雞

4列舉範圍:公雞1-14,總計算次數14

5列舉判斷條件:

6錢數=100:5公雞+3母雞+1/3小雞 = 100

7小雞%3==0

8(100-7x)%4==0910

11*/

12 #include 13

intmain()

1425}26

}2728return0;

29 }

列舉法又稱窮舉法,它是根據題意,列舉所有可能狀態,並用問題給定的條件來約束狀態,

檢驗哪些是需要的,哪些是不需要的。

列舉結構:迴圈+判斷語句。

設ai1—狀態元素ai的最小值;aik—狀態元素ai的最大值(1≤i≤n),即a11≤a1≤a1k,a21≤a2≤a2k, ai1≤ai≤aik,

……,an1≤an≤ank

for(a1=a11;a1<=a1k;a1++)

for(a2=a21;a2<=a2k;a2++)

.....

for(ai=ai1;ai<=aik;ai++)

.....

for(an=an1;an<=ank;an++)

if(狀態(a1,...,ai...,an)滿足檢驗條件)

輸出問題的解;

用列舉法解題的最大的缺點是運算量比較大,解題效率不高,如果列舉範圍太大(一般以不超過兩百萬次為限),在時間上就難以承受。

但列舉演算法的思路簡單,程式編寫和除錯方便,比賽時也容易想到,在比賽中,時間是有限的,我們比賽的最終目標是求出問題解,

因此,如果題目的規模不是很大,在規定的時間與空間限制內能夠求出解,那麼最好是採用列舉法。

a、縮小列舉範圍

b、減少列舉變數

c、使用其它演算法

弄清楚列舉變數、列舉範圍、列舉判斷條件,敲**就非常簡單,而且不容易出錯了

列舉變數:

列舉範圍:

列舉判斷條件:

百錢買百雞

公雞乙隻五塊錢,母雞乙隻三塊錢,小雞一塊錢三隻,

現在要用一百塊錢買一百隻雞,每種雞最少乙隻,問公雞、母雞、小雞各多少只?

列舉變數:公雞、母雞、小雞

列舉範圍:公雞、母雞、小雞都是1-100次,總計算次數100*100*100

列舉判斷條件:

錢數=100:5公雞+3母雞+1/3小雞 = 100

總雞數=100:公雞+母雞+小雞 = 100

小雞%3==0

1/*2

3百錢買百雞

4公雞乙隻五塊錢,母雞乙隻三塊錢,小雞一塊錢三隻,

5現在要用一百塊錢買一百隻雞,每種雞最少乙隻,問公雞、母雞、小雞各多少只?67

8列舉變數:公雞、母雞、小雞

9列舉範圍:公雞、母雞、小雞都是1-100次,總計算次數100*100*100

10列舉判斷條件:

11錢數=100:5公雞+3母雞+1/3小雞 = 100

12總雞數=100:公雞+母雞+小雞 = 100

13小雞%3==0

1415

*/16

17 #include 18

intmain()

1928}29

return0;

30 }

百錢百雞問題優化一:

5公雞+3母雞+1/3小雞 = 100

公雞+母雞+小雞 = 100

縮小列舉範圍

列舉變數:公雞、母雞、小雞

列舉範圍:公雞1-18,母雞1-32 ,小雞1-98次,總計算次數18*32*98

列舉判斷條件:

錢數=100:5公雞+3母雞+1/3小雞 = 100

總雞數=100:公雞+母雞+小雞 = 100

小雞%3==0

1/*2

3百錢百雞問題優化一:45

5公雞+3母雞+1/3小雞 = 100

6公雞+母雞+小雞 = 10078

縮小列舉範圍910

列舉變數:公雞、母雞、小雞

11列舉範圍:公雞1-18,母雞1-32 ,小雞1-98次,總計算次數18*32*98

12列舉判斷條件:

13錢數=100:5公雞+3母雞+1/3小雞 = 100

14總雞數=100:公雞+母雞+小雞 = 100

15小雞%3==0

1617

18*/

1920 #include 21

intmain()

2231}32

return0;

33 }

1/*2

3錢數=100:5公雞+3母雞+1/3小雞 = 100

4總雞數=100:公雞+母雞+小雞 = 10056

設公雞 x 只,母雞 y 只,小雞 z 只78

5x+3y+1/3z = 100

9x+y+z = 100

1011

列舉了x和y之後,z的值是固定的,z=100-x-y

12所以這個時候,z就不用列舉了

1314

列舉變數:公雞,母雞

15列舉範圍:公雞1-18,母雞1-32,總計算次數 18*32

16列舉判斷條件:

17錢數=100:5公雞+3母雞+1/3小雞 = 100

18小雞%3==0

1920

優化:減少了列舉的變數

21減少列舉的變數之後,列舉的次數大幅減少

2223

*/24 #include 25

intmain()

2635}36

37return0;

38 }

1/*2

3錢數=100:5公雞+3母雞+1/3小雞 = 100

4總雞數=100:公雞+母雞+小雞 = 10056

設公雞 x 只,母雞 y 只,小雞 z 只78

5x+3y+1/3z = 100

9x+y+z = 100

1011

第乙個式子*3

1215x+9y+z = 300

13x+y+z = 100

1415

得:16

14x+8y=20017即

187x+4y=100

19y=(100-7x)/4

20z=100-x-(100-7x)/4

2122

根據這個式子,有x之後,我們就可以得到y,從而得到z

23這裡7x小於等於96,x取值為1-14

2425

列舉變數:公雞

26列舉範圍:公雞1-14,總計算次數14

27列舉判斷條件:

28錢數=100:5公雞+3母雞+1/3小雞 = 100

29小雞%3==0

30(100-7x)%4==0

3132

33*/

34 #include 35

intmain()

3647}48

}4950return0;

51 }

Num 2 列舉 窮舉 演算法

可預先確定候選答案的數量 候選答案的範圍在求解之前必須有乙個確定的集合。例項1 填數遊戲 演算法描述題 x 算 題題題題題題 include stdafx.h include int main getchar return 0 例項2 填運算子 5 5 5 5 5 5 由於算術表示式的特殊性,在程式...

演算法基礎(1) 列舉

列舉在大家看來可能是乙個非常簡單的問題,不就是乙個遍歷演算法嘛,有什麼好說的,然而,在參加了北京大學mooc的演算法基礎後,我直接被震驚了。原來列舉演算法還能這麼玩!好吧,不說有的沒得沒得了,先來看第乙個例子 熄燈問題 這個問題的描述如下 乙個由按鈕組成的矩陣,其中每行有6個按鈕,共5行。每個按鈕的...

演算法基礎(一) 列舉

慕課 程式設計與演算法 二 演算法基礎 郭瑋老師課程的學習筆記 列舉,基於逐個嘗試答案的一種文體求解策略,根據所有可能的情況,並且一一判斷。大家可能會說列舉不就是一種簡單的將資料全都遍歷一遍嗎,但是在這裡我們將列舉進行優化,讓列舉更加聰明,從而達到演算法的目的,即提供更快更好的解題的方法,這樣列舉就...