整数划分问题

整数划分问题

题目描述
将正整数n表示为一系列正整数之和,

     n=n1+n2+n3+n4+......+nk   
   (其中,n1>=n2>=n3>=n4........>=nk>0,k>=1)

正整数n的这种表示成为正整数n的划分。正整数n的不同划分个数成为正整数n的划分数,记作p(n)。

例如,正整数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;
这是一道比较绕的递归问题,绕就绕在数学上,有点不好理解。
引入变量m表示最大加数,由上图分析可得
q( n, n ) = 1, 当 n ==1;

q( n, n ) = 1, 当m == 1;

q( n, n ) = q( n,n ) , 当n < m;

q( n, n ) = q( n, m-1) +1 , 当n == m;

q( n, n ) = q( n - m, m ) + q( n , m -1) , 当n > m;
也就是说,当m=n时,递归1+q( n, m-1) 比如m=n=6最大加数为6,则递归1+q(6,5),1既是6这种情况然后加上最大加数为5的所有情况,而最大加数为5仍需递归。
这时候n=6,m=5 又分为两种,q(6,4)即最大加数为4的所有情况和q(1,5)
如此再对q(6,4)递归
而当m或n等于1时只有1种情况也就是达到边界
递归结束后既出答案
在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;
int q(int n,int m)
{
	if(n==1||m==1){
		return 1;
	}else if(n>m){
		return q(n-m,m)+q(n,m-1);
	}else if(n<m){
		return q(n,n);
	}else{
		return 1+q(n,n-1);
	}
}
int main()
{
	double start,stop,dur;
	start=clock();
	int a=6;
	cout<<q(6,6);
	
	stop=clock();
	dur=stop-start;
	cout<<"\n用时:"<<dur<<"毫秒\n";
	return 0;

 
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值