問題描述:將一個正證書n表示成一系列正整數之和,n=n1+n2+n3+...+nk,其中n1>=n2>=n3>=n4>=....>=nk>=1,k>=1.
正整數N的不同劃分個數成為正整數n的劃分數,記作p(n)。
例如:p(6)=11。
6;
5+1;
4+2, 4+1+1;
3+3, 3+2+1, 3+1+1+1;
2+2+2, 2+2+1+1, 2+1+1+1+1;
1+1+1+1+1+1.
解決這樣問題,方法有很多,這裡說下用遞歸法解決的情況,程序寫起來非常簡單,最重要的是要理清思路,下面的思路解析,如果看不太懂,希望用心多看幾遍:
在正整數n的所有不同劃分中,將最大加數n1不大於m的劃分個數記作q(n,m)。這時可以建立如下遞歸關系:
(1)q(n,1) = 1,n>=1;即n=1+1+1。。。。。,n個1之和。
(2)q(n,m)=q(n,n),m>=n.
(3)q(n,n) = q(n,n-1) + 1.
(4)q(n,m) = q(n,m-1)+q(n-m,m),n>m>1;
或用下面的解釋,更加明確:
/* 在正整數n的所有不同的劃分中,將最大加數n1不大於m的劃分個數記作q(n, m),得到如下遞歸關系:
* 1. q(n, 1) = 1, ( n >= 1 );
* 當最大加數不大於1時,任何正整數n只有一種劃分n = 1 + 1 + 1 + ... + 1 。
* 2. q(n, m) = q(n, n), ( m >= n );
* 最大加數n1不能超過n。因此,q(1, m) = 1。
* 3. q(n, n) = 1 + q(n, n - 1);
* 正整數的劃分由n1 = n的劃分和n1 <= n-1的劃分組成。
* 4. q(n, m) = q(n, m-1) + q(n-m, m), ( n > m > 1 );
* 正整數的最大加數n1不大於m的劃分,由n1 = m的劃分和n1 <= m-1的劃分組成。
* n = m + * ( * = q(n-m, m) )
* n = (m - 1) + * ( * = q(n-m+1, m) )
* .......
*/
明白了吧,具體程序即自己寫吧。