程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 遞歸法之整數劃分問題

遞歸法之整數劃分問題

編輯:關於C語言
 

問題描述:將一個正證書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) )
* .......
*/

 

明白了吧,具體程序即自己寫吧。

 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved