列舉演算法:
百元買雞
列舉演算法的ì例子:問題如下:某3人有100元打算買100隻雞,其中公雞為5元每只,母雞為3元每只,小?雞為3只1塊錢,問可以買多少只公雞,母雞,小雞?
int x, y, z;
for (x = 0; x <= 20; x++)
for (y = 0; y <= 33; y++)
for (z = 0; z <= 100; z++)
if ((x + y + z == 100) && (5 * x + y * 3 + z / 3 == 100) && (z % 3 == 0))
console.writeline("公雞|:只,母?雞:只,小雞:只", x, y, z);
上述運算執行的次數為21*34*101=71114
問題的優化思想如下:
問題中,由於三種雞的和是固定的,因此只要列舉的兩種雞(x,y),第三種雞就可以根據約定的條件求得(z=100-x-y),就這樣就縮小了列舉的範圍變成了雙重迴圈。之所以選擇z,是因為z的數值較大,優化的效果更好,此時的迴圈的次數就變成了:21*34=714。
int x, y, z;
for (x = 0; x <= 20; x++)
for (y = 0; y <= 33; y++)
只,母?雞:只,小雞:只", x, y, z);
}問題的再進一步的優化:
如果從數學的角度來考慮列舉演算法的進一步的優化,程式的效率就會進一步的優化
根據題意:約束條件為:5x+3y+z/3=100;x+y+z=100;約去乙個z則得到7x+9y=100;x+y+z=100;所以只要列舉出x(最多位14)則y,z的值就可以自然而然的得到確定了。
計算1至n中數字x出現的次數,其中n〉=9,x為0-9
方法1:採用列舉的演算法,分立出1-n範圍內所有的資料的每一位上的數字,檢視是否為x,然後計數。
int cnt = 0, i, k, n, x;
n = convert.toint32(console.readline());
x = convert.toint32(console.readline());
for (i=1;i<=n;i++)
console .writeline ("",cnt);
這個方法的缺點就是時間複雜度太高,計算市乙個數中x的出現的次數的時間複雜度為o(log10n),計算全部的數中x的時間複雜度為o(nlog10n)
演算法的優化思維如下:
利用數學公式直接計算最終的結果,一次求出數字中x在個無人,視為百威的出現的是次數,在相加得到最終的結果。這裡x的範圍為1-9,因為=0不符合下列規律,需要單獨的計算。
首先規律如下:
(1) 從1到10,在他們的個位數中任意的x都出現了1次
(2) 從1至100,在他們的十位數中,任意的x都出現了10次
(3) 從1至1000,在他們的百位數中,任意的x都出現了100次
以此類推,從1至10i,在他們的左數第二位(右數第i位)中,任意的x都出現了10i-1次。
計算右數第i位包含的x的個數演算法:
(1) 取第i位左邊(高位)的數字,乘以10i-1,得到基礎值a。
(2) 取第i位數字,計算修正值:
如果大於x,則結果為a+10i-1;
如果小於x,則結果為a。
如果等於x,則第i為右邊(低位)數字,設為b,最後的結果為a+b+1。時間複雜度為
o(log10n)
**如下:
int cnt = 0, i, k, n, x, c;
n = convert.toint32(console.readline());
x = convert.toint32(console.readline());
for (i = 1; (k = n / i) != 0; i*=10)
console.writeline("", cnt);
C 列舉演算法
列舉法,即對於問題所求,對所有與之相關的事物一一枚舉,樸素地暴力地解決問題。適用性非常廣泛,理論上能計算出所有求值問題 求解問題 計數問題 動態維護問題等問題的答案 優點 容易理解,容易實現,保證正確性,適用性廣 缺點 效率低下 騙分過樣例,暴力出奇蹟 爆搜掛著機,打錶出省一 n 方過百萬,暴力踩標...
C 列舉演算法
列舉演算法 什麼是列舉?列舉,顧名思義,就是用最笨的方法,去解決問題 暴力列舉 乙個集的列舉是列出某些有窮序列集的所有成員的程式,或者是一種特定型別物件的計數。這兩種型別經常 但不總是 重疊。列舉演算法是我們在日常中使用到的最多的乙個演算法,它的核心思想就是 列舉所有的可能 列舉法的本質就是從所有候...
C 學習筆記 列舉
一 c 的enum工具提供了另一種建立符號常量的方式,這種方式可以代替const。它還允許定義新型別,但必須按嚴格的限制進行。使用enum的語法與使用結構類似。例如 enum spectrum 這句語法包含兩個意義 1 讓spectrum成為新型別的名稱 spectrum被稱為列舉,就像struct...