**
算法定義
**
枚舉算法(Exhaustion Attack method,也稱作“窮舉法”)是指從可能的集合中一一列舉出各個元素,用題目給定的約束條件判斷那些是無用的,那些是有用的。能使命題成立者即爲問題的解。
枚舉算法效率並不高,但是適合於一些沒有明顯規律可循的場合。
能解決什麼問題(應用場合)
根據算法的定義,可以發現該算法有如下特點:
(1)題目的答案是一個有窮的集合,即答案可以被一一列舉出來;
(2)題目存在給定的約束條件,根據條件可以判斷哪些答案符合要求,哪些答案不符合要求。
(3)算法存在循環運算,一般使用while循環實現。
**
算法的優缺點
**
優點:思路簡單,無論是程序編寫,還是調試都很方便。如果題目不是很大,在規定的時間與空間限制內能夠求出解,那麼最好是採用枚舉法。
缺點:是運算量比較大,解題效率不高。如果枚舉範圍太大(一般以不超過2 000 000次爲限),效率低的問題會在時間上難以承受。
算法思路
枚舉算法一般按照如下3個步驟:
第一步:確定解題範圍,枚舉出所有可能的題解;
第二步:判斷題解是否符合正解的條件;
第三步:使可能解的範圍降至最小,以便提高解題效率。
**
案例分析【百錢買百雞】
**
這是依據我國古代數學家張丘建在《算經》上的“百雞問題”編寫而成的。“百雞問題”是一道聞名於世界的題目,很有價值,也很有趣味。題目的原文是:
“今雞翁一值錢五,雞母一值錢三,雞雛三值錢一。凡百錢買雞百隻,問:雞翁、母、雛各幾何?”
用通俗的話來說,題目的意思可以是:
用100文錢買來100只雞,公雞5文錢一隻,母雞3文錢一隻,小雞1文錢3只。問:在這100只雞中,公雞、母雞、小雞各是多少隻?
使用不定方程求解“百錢買百雞”的問題,其解題如下:
解:設公雞X只,母雞Y只,小雞Z只;得
枚舉算法 - 依波路 - 依波路的博客
這裏X、Y、Z爲正整數,且Z是3的倍數;由於雞和錢的總數都是100,可以確定X、Y、Z的取值範圍。
X的取值範圍爲0~20(100÷5=20)
Y的取值範圍爲0~33(100÷3≈33)
Z的取值範圍爲0~99,步長爲3
**
算法分析
**
使用枚舉方法解決這樣的問題,只需遍歷x、y、z的所有可能組合,即得到問題的解。
數據要求
問題中的常量:無
問題的輸入:無
**
具體實現代碼如下
**
include “stdio.h”
main(){
int x,y,z;
for(x=0;x<=20;x++){
for(y=0;y<=33;y++){
z=100-x-y;
if((5*x+3*y+z/3==100)&&(x+y+z==100))
printf("公雞:%d,母雞:%d,小雞:%d\n",x,y,z);}
}
}