整数划分问题

整数划分问题是算法中的一个经典命题之一。整数划分是指把一个正整数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);
}

 

posted @ 2015-09-25 17:33  lucky_少哖  阅读(459)  评论(0编辑  收藏  举报