1、定義
按照問題的要求,一一枚舉所有有可能的解,然後進行判斷,若符合要求則採納這個解,不符合就拋棄。
2、演算法實現
第一部分(迴圈部分):
利用迴圈把所有有可能的解,一一枚舉出來。需注意不能遺漏任何乙個解,也要避免重複。
要考慮如何設計迴圈變數、初值、終值和遞增值。迴圈變數是否參與檢驗。
為了提高解題效率,盡可能的縮小列舉範圍。
第二部分(檢驗);
準確找出判斷條件,對每乙個解進行檢驗。
3、列舉演算法例項
第一題:分數拆分(fractions again?!,uva 10976)
輸入乙個正整數k,找到所有的正整數x>=y,使得1/k=1/x+1/y。
樣例輸入212
樣例輸出
21/2 = 1/6 + 1/3
1/2 = 1/4 + 1/4
81/12 = 1/156 + 1/13
1/12 = 1/84 + 1/14
1/12 = 1/60 + 1/15
1/12 = 1/48 + 1/16
1/12 = 1/36 + 1/18
1/12 = 1/30 + 1/20
1/12 = 1/28 + 1/21
1/12 = 1/24 + 1/24
解題思路:由給出的式子,和x>=y,可知,k#include #include #include #include #include using namespace std;
int main()
}printf("%d\n",cnt);
for(int i=k+1;i<=2*k;i++)
}}return 0;
}第二題 除法(division,uva 725)
輸入正整數n,按從小到大的順序輸出所有形如abcde/fghij = n的表示式,
其中aj恰好為數字09的乙個排列(可以有前導0),2<=n<=79。
如果不存在 ,則輸出there are no solutions for n.n為0是結束程式。
樣例輸入
6162
0樣例輸出
there are no solutions for 61.
79546 / 01283 = 62
94736 / 01528 = 62
解題思路:列舉分母從1234~98765 ,用陣列a[10]來判斷是否重複。
**如下:
#include #include #include #include #include #include #include using namespace std;
int main()
; int x,m,j,b,k;
for(int i=1234;i<=98765;i++)
a[m]=1;
x=x/10;
}if(j==5)
a[m]=1;
x=x/10;
}if(k==5) }}
if(flag==0) printf("there are no solutions for %d.\n",n);
}return 0;
}
五大常用演算法 例項列舉
五大常用演算法 例項列舉 1.分治法 話說遞迴與hanoi塔 二分法求方程近似解 用c 實現合併排序 求最大值和最小值的分治演算法 2.動態規劃法 動態規劃求0 1揹包問題 最長公共子串問題的實現 用動態規劃實現飛彈攔截 最大化投資回報問題的實現 3.貪心演算法 最小生成樹之prim演算法 最小生成...
五大基礎演算法 分治法
1 定義 分治法的主題思想就是分而治之,也就是說把乙個大原問題變成兩個或者多個小問題解決,最後把小問題的解合併起來就是原問題的解。分 將原問題分解為多個小問題 治 將這些小問題逐個解決 合 將小問題解合併,就得出原問題的解 2.演算法實現 a 分治法的正規化 分解問題 把原問題分解為若干個與原問題性...
五大常用演算法
主要是演算法演算法的複雜度 1.分治法 話說遞迴與hanoi塔 二分法求方程近似解 用c 實現合併排序 求最大值和最小值的分治演算法 2.動態規劃法 動態規劃求0 1揹包問題 最長公共子串問題的實現 用動態規劃實現飛彈攔截 最大化投資回報問題的實現 3.貪心演算法 最小生成樹之prim演算法 最小生...