枚舉法的本質就是從全部候選答案中去搜索正確的解,使用該算法須要滿足兩個條件:
1、能夠先確定候選答案的數量。
2、候選答案的范圍在求解之前必須是一個確定的集合。
枚舉是最簡單。最基礎。也是最沒效率的算法
枚舉法長處:
1、枚舉有
超級無敵准確性。僅僅要時間足夠。正確的枚舉得出的結論是絕對正確的。
2、枚舉擁有天下第一
全面性,由於它是對全部方案的全面搜索。所以,它可以得出全部的解。
程序優化:
對於枚舉算法,
加強約束條件,縮小枚舉的范圍。是程序優化的主要考慮方向。
實例1:百錢買百雞
一百個銅錢買了一百僅僅雞。當中公雞一僅僅3錢、母雞一僅僅5錢。小雞一錢3僅僅,問一百僅僅雞中公雞、母雞、小雞各多少)
一百個銅錢買了一百僅僅雞。當中公雞一僅僅3錢、母雞一僅僅5錢。小雞一錢3僅僅,問一百僅僅雞中公雞、母雞、小雞各多少)
代碼:
#include<iostream> const int COCKPR = 3; const int HENPR = 5; const int CHICKS = 3; //原錯誤const double CHICKPR = 1/3; 1 3 為整形,1/3也為整形所以為0,又一次聲明1錢能買3僅僅小雞 void buyChicken(int money, int chooks); int main() { int money = 100; int chooks = 100; buyChicken(money, chooks); return 0; } void buyChicken(int money, int chooks) { using namespace std; int MaxCock = money/COCKPR; int MaxHen = money/HENPR; int MaxChick = chooks; int cock,hen,chick; int count = 0; for(cock=0; cock<= MaxCock; cock++) { for(hen=0; hen<=MaxHen; hen++) { for(chick=0; chick<=MaxChick; chick++) { if (0 == chick%3 && cock + hen + chick == chooks && COCKPR*cock + HENPR*hen + chick/CHICKS == money) cout << "公雞: " << cock << " 母雞: " << hen << " 小雞: " << chick << " 第 " << count << "有結果" <<endl; count ++; } } } cout << "總共枚舉多少次:" << count <<endl; }
執行結果:

僅僅對小雞的數量加入一個最小的起始值
函數里面加 int MinChick = chooks-MaxCock-MaxHen;
把最里層小雞數量的for循環的起始條件改為小雞最小值 for(chick=MinChick; chick<=MaxChick; chick++)
運算時間復雜度例如以下。
時間復雜度降低一半。說明對於枚舉算法。加強約束條件。縮小枚舉的范圍,是程序優化的主要考慮方向。

代碼例如以下:
#include<iostream> const int COCKPR = 3; const int HENPR = 5; const int CHICKS = 3; //原錯誤const double CHICKPR = 1/3; 1 3 為整形。1/3也為整形所以為0,又一次聲明1錢能買3僅僅小雞 void buyChicken(int money, int chooks); int main() { int money = 100; int chooks = 100; buyChicken(money, chooks); return 0; } void buyChicken(int money, int chooks) { using namespace std; int MaxCock = money/COCKPR; int MaxHen = money/HENPR; int MaxChick = chooks; int MinChick = chooks-MaxCock-MaxHen; int cock,hen,chick; int count = 0; for(cock=0; cock<= MaxCock; cock++) { for(hen=0; hen<=MaxHen; hen++) { for(chick=MinChick; chick<=MaxChick; chick++) { if (0 == chick%3 && cock + hen + chick == chooks && COCKPR*cock + HENPR*hen + chick/CHICKS == money) cout << "公雞: " << cock << " 母雞: " << hen << " 小雞: " << chick << " 第 " << count << "有結果" <<endl; count ++; } } } cout << "總共枚舉多少次:" << count <<endl; }
實例2:填數字游戲

代碼:
#include<iostream> int main() { using namespace std; int t1,t2,t3,t4,t5; for (t1=1; t1<=9; t1++) { for(t2=0; t2<=9; t2++) { for(t3=0; t3<=9; t3++) { for(t4=0; t4<=9; t4++) { for(t5=0; t5<=9; t5++) { if(t5*100000 + t5*10000 + t5*1000 + t5*100 + t5*10 + t5 == t5*t1 + t4*t1*10 + t3*t1*100 + t2*t1*1000 + t1 *t1*10000 ) { cout << " 算的數值為: " << t1 << " 法的數值為: " << t2 << " 描的數值為: " <<t3 << " 述的數值為: " << t4 << " 題的數值為: " << t5<<endl; cout << " " << t1 << " " << t2 << " " << t3 << " " << t4 << " " << t5 <<endl; cout << "X " << t1<<endl; cout << "________________\n"; cout << " " << t5 << " " << t5 << " " << t5 << " " << t5 << " " << t5 << " " << t5 <<endl; } } } } } } return 0; }
執行結果:
