列舉法又稱窮舉法,它是根據題意,列舉所有可能狀態,並用問題給定的條件來約束狀態,檢驗哪些是需要的,哪些是不需要的。迴圈+判斷語句,列舉幾個變數就迴圈幾次
設ai1—狀態元素ai的最小值;aik—狀態元素ai的最大值(1a、縮小列舉範圍≤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)滿足檢驗條件)
輸出問題的解;
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/*23百錢百雞問題優化一: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/*23錢數=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/*23錢數=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行。每個按鈕的...
演算法基礎(一) 列舉
慕課 程式設計與演算法 二 演算法基礎 郭瑋老師課程的學習筆記 列舉,基於逐個嘗試答案的一種文體求解策略,根據所有可能的情況,並且一一判斷。大家可能會說列舉不就是一種簡單的將資料全都遍歷一遍嗎,但是在這裡我們將列舉進行優化,讓列舉更加聰明,從而達到演算法的目的,即提供更快更好的解題的方法,這樣列舉就...