整數劃分 遞迴

2021-08-22 05:58:21 字數 974 閱讀 2414

將正整數n表示成一系列正整數之和:n=n1+n2+…+nk, 

其中n1≥n2≥…≥nk≥1,k≥1。 

正整數n的這種表示稱為正整數n的劃分。求正整數n的不 

同劃分個數。 

例如正整數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。 

第一行是測試資料的數目m(1<=m<=10)。以下每行均包含乙個整數n(1<=n<=10)。
輸出每組測試資料有多少種分法。
複製

1

6

11
#include#include#include#include#include#include#include#include#define inf 0x3f3f3f3f

using namespace std;

typedef long long ll;

const int n=15;

int dg(int n,int m)

,當m=1時,即n個1

return 1;

if(n==m)//(1)n=m時,即乙個,(2)n的m-1的所有劃分個數(1)+(2)=dg(n,m-1)+1;

return dg(n,m-1) + 1;

if(nm)//(1)當不出現m時,即為n的m-1的所有劃分個數,(2)當出現m時,,

return dg(n,m-1) + dg(n-m,m);/

//其中[x1,x2,x3...]中為n-m個,這裡有可能出現m,所以為n-m的m劃分,即q(n-m,m); 最終得(1)+(2)=dg(n,m-1)+ dg(n-m,m);

}int main()

return 0;

}

整數劃分(遞迴)

整數劃分問題是演算法中的乙個經典命題之一,有關這個問題的講述在講解到遞迴時基本都將涉及。所謂整數劃分,是指把乙個正整數n寫成如下形式 n m1 m2 mi 其中mi為正整數,並且1 mi n 則為n的乙個劃分。如果中的最大值不超過m,即max m1,m2,mi m,則稱它屬於n的乙個m劃分。這裡我們...

整數劃分(遞迴)

package test04 元素n的劃分,即存在某些數,n1,n2,n3,n4.使得n1 n2 n 比如6的劃分共有11種,count 6,4 9 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 publi...

整數劃分(遞迴)

將正整數n表示成一系列正整數之和 n n1 n2 nk 例如對於正整數6 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 1 所以對於正整數6有p 6 11中劃分 在正整數n的所有不同劃分中,將最大加數n1不...