整数划分问题

我们来分析一下一个整数是怎么被划分的

1+1+1+1+1
1+1+1+2
1+1+3
1+2+2
2+3
1+4
5

再分析一下6,我们可以发现相邻两个数之间也没有什么规律。所以只好通过研究一个整数被划分的方法来求解。

n=m1+m2+m3+.......+mi;

{m1,m2,m3,m4,......mi}是n的一个划分。

如果{m1,m2,m3,m4,......mi}的中的最大值不超过m,即max{m1,m2,m3,m4,......mi}<=m,我们可以称它为一个n的m划分。

用f(n,m)表示n的m划分的个数。

1.m=1,情况是这样的,{1,1,1,1,1,1},f(n,m)=1;

2.n=1,情况是这样的,{1}f(n,m)=1;

3.n==m

有两种情况需要考虑。

3.1如果划分中包含n,就变成了这样{n};

3.2如果划分中不包含n,{m1,m2,m3,m4...mi},在这个集合中最大的数小于n为n-1,即个数应该为f(n,n-1);

在这种情况下f(n,m)=f(n,n-1)+1;

4.n<m

max{m1,m2,m3,m4...mi}<=m,而划分里面的数1<=mi<=n,f(n,m)=f(n,n);

5.n>m

有两种情况需要考虑。

5.1划分中包含m{m,{m1,m2,m3,m4....mi}},{m1,m2,m3,m4....mi}的和为n-m,f(n-m,m)

5.2划分中不包含m,max{m1,m2,m3,.....mi}<=m-1,f(n,m-1};

在这种情况下f(n,m)=f(n-m,m)+f(n,m-1);

题目内容:
对于一个正整数n的划分,就是把n变成一系列正整数之和的表达式。注意,分划与顺序无关,例如6=5+1跟6=1+5是
同一种分划。另外,单独这个整数本身也算一种分划。
例如:对于正整数n=5,可以划分为:
1+1+1+1+1
1+1+1+2
1+1+3
1+2+2
2+3
1+4
5
输入描述
输入一个正整数n


输出描述
输出n整数划分的总数k


输入样例
5


输出样例
7

#include<iostream>
using namespace std;
int f(int n,int m){
	if(n==1||m==1){
		return 1;
	}
	if(n<1||m<1){
		return 0;
	}
	if(n==m){
		return 1+f(n,n-1);
	}
	if(n<m){
		return f(n,n);
	}
	if(n>m){
		return f(n-m,m)+f(n,m-1);
	}
}
int main(){
	int s;
	cin>>s;
	cout<<f(s,s)<<endl;
	return 0;
	
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值