将正整数n 表示成一系列正整数之和,n=n1+n2+…+nk, 其中n1>=n2>=…>=nk>=1 ,k>=1 。
正整数n 的这种表示称为正整数n 的划分。正整数n 的不同的划分个数称为正整数n 的划分数。
Input
标准的输入包含若干组测试数据。每组测试数据是一个整数N(0 < N <= 50)。
Output
对于每组测试数据,输出N的划分数。
Sample Input
5
Sample Output
7
Hint
5, 4+1, 3+2, 3+1+1, 2+2+1, 2+1+1+1, 1+1+1+1+1
//找好状态量便成功了一半
#include <iostream>
#include <cstdio>
using namespace std;
// n:被减数;i:减数
int ways(int n,int i)
{
//两个边界
if( n == 0)//n是在不断变小的,当他减到0时,即满足情况
return 1;
if( i == 0)
return 0;
//核心
if( n >= i)//被减数大于等于减数
return ways(n-i,i) + ways(n,i-1); //用i同时i可以重复使用和不用i的情况。
else //被减数小于减数
return ways(n,i-1);
}
int main()
{
int n;
while(cin >> n) //满足多组输入,遇到EOF终止
cout << ways(n,n) << endl;
}