列舉(窮舉)演算法

2021-09-16 21:32:59 字數 2063 閱讀 3008

一、所謂列舉

1、列舉法的本質就是從所有候選答案中去搜尋正確的解。

它的核心思想就是列舉所有的可能

2、使用該演算法需要滿足兩個條件

(1)可預先確定候選答案的數量

(2)候選答案的範圍在求解之前必須有乙個確定的集合

3、基本框架

二、基本思想

1、列舉演算法簡單粗暴,他暴力的列舉所有可能,盡可能地嘗試所有的方法。雖然列舉演算法非常暴力,而且速度可能很慢,但確實我們最應該優先考慮的!因為列舉法變成實現最簡單,並且得到的結果總是正確的。

2、在實際問題中, 有些變數的取值被限定在乙個有限的範圍內。例如,乙個星期內只有七天,一年只有十二個月, 乙個班每週有六門課程等等。如果把這些量說明為整型, 字元型或其它型別顯然是不妥當的。 為此,c語言提供了一種稱為「列舉」的型別。在「列舉」型別的定義中列舉出所有可能的取值, 被說明為該「列舉」型別的變數取值不能超過定義的範圍。應該說明的是,枚舉型別是一種基本資料型別,而不是一種構造型別, 因為它不能再分解為任何基本型別

三、定義

enum  列舉名  

; enum weekday //舉例

;

在列舉值表中應羅列出所有可用值。這些值也稱為列舉元素

四、優缺點

優點:演算法簡單,在區域性地方使用列舉法,效果十分好

缺點:運算量過大,當問題的規模變大的時候,迴圈的階數越大,執行速度越慢

五、使用規定

1、列舉值是常量,不是變數。不能在程式中用賦值語句再對它賦值。例如對列舉weekday的元素再作以下賦值: sun=5; mon=2; sun=mon; 都是錯誤的。

2、列舉元素本身由系統定義了乙個表示序號的數值,從0 開始順序定義為0,1,2…。如在weekday中,sun值為0,mon值為1, …,sat值為6。

3、列舉值也可以用來做判斷比較。如:if(mon>sun) …

4、列舉變數的值可以由程式設計師自己定。

如:enum weekday;

定義sun為7,mon為1,以後按順序加1,即tue=1,wed=3。

5、能把列舉值賦予列舉變數,不能把元素的數值直接賦予列舉變數。如: a=sum;b=mon; 是正確的。而: a=0;b=1; 是錯誤的。

如一定要把數值賦予列舉變數,則必須用強制型別轉換,如: a=(enum weekday)2;其意義是將順序號為2的列舉元素賦予列舉變數a,相當於: a=tue; 還應該說明的是列舉元素不是字元常量也不是字串常量, 使用時不要加單、雙引號。

六、列舉演算法例項

百錢買百雞

1、問題描述:

公雞每只5元,母雞每只3元,三隻小雞1元,用100元買100隻雞,問公雞、母雞、小雞各多少只?

2、演算法分析:

利用列舉法解決該問題,以三種雞的個數為列舉物件,分別設為g、m、x,用三種雞的總數 g+m+x=100,買雞錢的總數 g5+m3+x*1/3=100 作為判定條件,列舉各種雞的個數。

3、**

#includeusing namespace std;

int main()

} return 0;

}

執行結果:

列舉 窮舉 演算法

列舉法的本質就是從候選答案中去搜尋正確的解,使用該演算法需要滿足兩個條件 例 填數字遊戲 abcde x e eeeeee 問a,b,c,d,e各為多少?如下 例 填運算子5 運算子1 5 運算子2 5 運算子3 5 運算子4 5 5 問運算子各位啥滿足等式,且該等式不能用括號。分析 由於算術表示式...

演算法之暴力列舉(窮舉)

列舉法的基本思想是根據題目的部分條件確定答案的大致範圍,並在次範圍內對所有可能的情況逐一驗證,直到全部情況驗證完畢。若某個情況驗證符合題目的全部條件,則為本問題的乙個解 若全部情況驗證後都不符合題目的全部條件,則本題無解。也稱為窮舉法。題目 某人有n袋金幣,其中第i袋內金幣的數量是ai。現在他決定選...

Num 2 列舉 窮舉 演算法

可預先確定候選答案的數量 候選答案的範圍在求解之前必須有乙個確定的集合。例項1 填數遊戲 演算法描述題 x 算 題題題題題題 include stdafx.h include int main getchar return 0 例項2 填運算子 5 5 5 5 5 5 由於算術表示式的特殊性,在程式...