OpenJ_Bailian - 4117:简单的整数划分问题

版权声明:本文为博主原创文章,未经博主允许不得转载。https://blog.csdn.net/uzzzhf https://blog.csdn.net/uzzzhf/article/details/89359642

将正整数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;
}

猜你喜欢

转载自blog.csdn.net/uzzzhf/article/details/89359642