整数划分问题是算法中的一个经典命题之一。整数划分是指把一个正整数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+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
如果{n1,n2,···,ni}中的最大加数s不超过m,即s=max(n1,n2,···,ni)≤m,则称它属于n的一个m划分。记n的m划分个数为f(n,m)。该问题就转化为求n的所有划分个数f(n,n)。可以建立f(n,m)的递归关系如下:
1,f(1,m)=1,m≥1
2,f(n,1) =1,n≥1
3,f(n,m)=f(n,n),m≥n
4,f(n,n)=1+f(n,n-1)
5,f(n,m)=f(n,m-1)+f(n-m,m),n>m>1
代码的实现
int split(int n,int m) { if(n==1||m==1) return 1; else if(n<m) return split(n,n); else if(n==m) return split(n,n-1)+1; else return split(n,m-1)+split(n-m,m); }