91.整数划分 (15分)
C时间限制:2 毫秒 | C内存限制:65535 Kb
题目内容:
对于一个正整数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
思路:n划分后开头最大的数有从1到n的情况,要分别求,尤其要明白递归时return dg(a-1,n-1)+dg(a,n-a)第一个为什么是dg(a-1,n-1)而不是dg(a-1,n-a),这题应该可以dp来写
#include<iostream>
#include<stdio.h>
using namespace std;
long long dg(int a,int n)
{
if(a==1||a==n)return 1;
else if(n>a)return dg(a-1,n-1)+dg(a,n-a);
else return 0;
}
void solve()
{
long long n,da=0;
cin>>n;
for(long long i=1;i<=n;i++)
{
da+=dg(i,n);
}
cout<<da;
}
int main()
{
solve();
return 0;
}