枚舉算法

**

算法定義

**
枚舉算法(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);}
           }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章