将正整数S表示成一系列正整数之和,n=n1+n2+n3.........+nk ;其中,n1>n2>n3>....>nk ,k>1; 正整数S的不同划分个数称为S的划分,记作P(S)。
设n的最大零数不超过m的拆分个数为q(n,m),则:
q(n,m)=1+q(n,n-1) (n=m)
q(n,m)=q(n,m-1)+q(n-m,m);
q(n,m-1)表示零数中不包括m的拆分式数目,q(n-m,m)表示零数中包含一个m的拆分数目,既然零数中肯定有m了,那么剩下的就是对n-m进行不超过m的拆分。
代码:
int DevideNumber(int n, int m)
{
if (n<1||m<1)//0
{
return 0;
}
if (n==1||m==1)//1
{
return 1;
}
if (n<m)//数字比最大零数小,那么最大零数也是n
{
return DevideNumber(n,n);
}
if (n==m)//最大零数等于该数,则结果是1加上最大零数为m-1的情况
{
return DevideNumber(n,m-1)+1;
}
return DevideNumber(n,m-1)+DevideNumber(n-m,m);//前一个表示拆分的最大零数不超过m-1,后一个表示拆分的零数中肯定有m,
//则剩下的部分是对n-m进行不超过m的拆分
}