將正整數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)。
輸出每組測試資料有多少種分法。複製
16
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不...