枚舉的概念
枚舉就是列出一個範圍內的全部成員的程序,或者說是將全部狀況都舉出,並判斷其是否符合題目條件,生活中常見的枚舉有星期,裏面有星期1、星期二... ...星期日... ...
在C++裏面最多見的枚舉就是數組的for循環,這種循環就是把數組中的每個元素都列舉一遍。ios
枚舉的優缺點
優勢:1.能舉出全部狀況,保證解爲正確解。
2.能解決許多用其餘算法難以解決的問題。
3.便於思考與編程。
缺點:爲什麼要叫作暴力枚舉呢?由於暴力出奇跡,可是暴力在大多數狀況下都是不可取。枚舉僅適用於一些規模較小的問題。(不然可能會超時)算法
例1:百錢百雞
【P1062】一隻公雞值5元,一隻母雞值3元,而1元可買3只小雞。現有100元錢,想買100只雞。問可買公雞、母雞、小雞各幾隻?
【輸入描述】無。
【輸出描述】n行,每行3個數字,分別表示公雞、母雞、小雞的數量。
【樣例輸入】無
【樣例輸出】0 25 75
... ...編程
百錢百雞解析
1.在數學中解決這個問題,咱們一般會列出一個方程組,設公雞x只,母雞y只,小雞z只,即:數組
同時知足上述兩個條件的x、y、z值就是所求。
2.爲了解決以上的問題,咱們能夠經過三重循環將全部狀況都列一遍,而後經過if判斷是否是知足條件,若是知足條件,便輸出。
公雞數量x的取值範圍是0~100/5,母雞數量y的取值範圍是0~100/3,小雞數量z的取值範圍是0~3*100(而且要知足小雞的數量是3的倍數)。
3.因爲題目的特殊性,公雞、母雞、小雞共100只,一旦肯定公雞x和母雞y的數量,小雞便只能購買100-x-y只。這樣,咱們能夠嘗試寫出一個兩層循環的程序,解決這個問題。spa
百錢百雞參考代碼code
#include <iostream> using namespace std; int main() { int x,y,z; for (x=0;x<=100/5;x++) for (y=0;y<=100/3;y++) { z=100-x-y; if (5*x+3*y+z/3.0==100) cout<<x<<" "<<y<<" "<<z<<endl; } return 0; }
例2:換錢
【P1063】某人想將手中的一張面值100元的人民幣換成10元、5元、2元和1元面值的票子。要求換正好40張,且每種票子至少一張。問:有幾種換法,分別是什麼?應適當考慮減小循環次數。
【輸入描述】 無
【輸出描述】n行,每行4個數字,分別表示10元、5元、2元、1元的數量。
【樣例輸入】無
【樣例輸出】1 5 31 3
... ...數學
換錢解析
1.由於每種票子至少一張,因此x,y,z,k三個變量的值都要大於等於1,因此x,y,z的最小值應該是1,最大不能達到10,20,50張。即:io
換錢參考代碼for循環
#include <iostream> using namespace std; int x,y,z,k; int main() { for (x=1;x<10;x++) for (y=1;y<20;y++) for (z=1;z<50;z++) { k=40-x-y-z; if(10*x+5*y+2*z+k==100&&k>0) { cout<<x<<" "<<y<<" "<<z<<" "<<k<<endl; } } return 0; }
經過上面的例題,你們對暴力枚舉是否是有必定的理解了呢?stream