一、問題描述
將正整數n表示成一系列正整數之和:
n=n1+n2+...+nk;(其中n1>=n2>=...>=nk)
如6:共有11種
6=6;
6=5+1;
6=4+2; 6=4+1+1;
6=3+3; 6=3+2+1; 6=3+1+1+1;
6=2+2+2; 6=2+2+1+1; 6=2+1+1+1+1;
6=1+1+1+1+1+1;
如5:共有7種
5=5;
5=4+1;
5=3+2; 5=3+1+1;
5=2+2+1; 5=2+1+1+1;
5=1+1+1+1+1;
二、問題分析
從整數劃分的例子中,可以採用遞迴的思想去解決。如整數6,它的第一步是從6-1;第二步則是從第一步的差以及小於第一步的數開始,依次類推,直至這些整數之和為6.
如6=5+1;第一步是5,第一步的差是6-5=1,所以第二步從第一步5和第一步的差1兩者較小數1開始遞減;
6=1+1+1+1+1+1,第一步是1,第一步的差是6-1=5,所以第二步從第一步1和第一步的差5兩者較小數1開始遞減,這樣後面只能是1,這樣才能保證劃分的規律性。
三、程式設計
#include
using namespace std;
int num=0; //記錄劃分的類別數
void int_part(int n,int j) //n記錄整數的剩餘數,j記錄上一步的數,確保是按照遞減的數累加
for(int i=n0;i--) //i取兩者之間的小值,利用條件表示式
int_part(n-i,i);
}void main()
四、程式結果
整數劃分問題遞迴
整數劃分問題是演算法中的乙個經典命題之一,有關這個問題的講述在講解到遞迴時基本都將涉及。所謂整數劃分,是指把乙個正整數n寫成如下形式 n m1 m2 mi 其中mi為正整數,並且1 mi n 則為n的乙個劃分。如果中的最大值不超過m,即max m1,m2,mi m,則稱它屬於n的乙個m劃分。這裡我們...
整數劃分問題 遞迴
1.程式直接或間接呼叫自身的程式設計技巧稱為遞迴演算法 recursion 2.乙個過程或函式在其定義或說明中又直接或間接呼叫自身的一種方法,它通常把乙個大型複雜的問題層層轉化為乙個與原問題相似的規模較小的問題來求解,遞迴策略只需少量的程式就可描述出解題過程所需要的多次重複計算,大大地減少了程式的 ...
整數劃分問題(遞迴)
將正整數 n 表示成一系列正整數之和,n n1 n2 nk,其中 n1 n2 nk 1 k 1 正整數 n 的這種表示稱為正整數 n 的劃分。正整數 n 的不同的劃分個數稱為正整數 n 的劃分數,記作 p n 例如正整數 6 有如下 11 種不同的劃分,所以 p 6 11 6 5 1 4 2,4 1...