递归之划分数

将正整数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的拆分
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值