算法积累 <1>整数划分问题

 
 
将正整数n表示成一系列正整数之和,n = n1+n2+n3+n4+.....+nk(其中,n1>=n2>=.....>=nk>=1,k>=1)

正整数n的这种表示称为正整数n的划分,正整数n的不同的划分个数称为正整数n的划分数,记作P(n).


思路: 我们将待拆分的正整数称为n m 为最大加数 我们记共有q(n,m)种分法;


我们分为四种情况。

1.n=1或m=1; q(n,m)=1;

2.n<m          ; q(n,m) = q(n,n);

3.n=m          ; q(n,m) =1+q(n,n-1);

4.n>m>1      ; q(n,m-1)+q(n-m,m);

 


由次设计了q(n,m)的递归函数如下

 

int q(int n,int m)
{
if((n<1)||(m<1)) return 0;
if((n==1)||(m==1)) return 1;
if(n<m) return q(n,n);
if(n==m) return q(n,m-1)+1;
return q(n,m-1)+q(n-m,m);
}


因为是递归所以不能扣得太仔细 一层层深入太容易绕进去     所以可以用简单的例子来理解思想和实现过程 



你可能感兴趣的:(算法)