- 了解列舉的基本概念,
- 了解列舉的優缺點,
- 掌握列舉的經典題型,
列舉的概念
列舉就是列出一個范圍內的所有成員的程式,或者說是將所有情況都舉出,并判斷其是否符合題目條件,生活中常見的列舉有星期,里面有星期一、星期二... ...星期日... ...
在C++里面最常見的列舉就是陣列的for回圈,這種回圈就是把陣列中的每一個元素都列舉一遍,
列舉的優缺點
優點: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只,這樣,我們可以嘗試寫出一個兩層回圈的程式,解決這個問題,
百錢百雞參考代碼
#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張,即:
換錢參考代碼
#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;
}
通過上面的例題,大家對暴力列舉是不是有一定的理解了呢?
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/1835.html
標籤:C++
上一篇:Spring Cloud微服務Sentinel+Apollo限流、熔斷實戰總結
下一篇:數字統計
