我们来分析一下一个整数是怎么被划分的
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;
}