程序设计与算法二郭炜递归006简单的整数划分问题及解题思路

题目

将正整数n 表示成一系列正整数之和,n=n1+n2+…+nk, 其中n1>=n2>=…>=nk>=1 ,k>=1 。
正整数n 的这种表示称为正整数n 的划分。正整数n 的不同的划分个数称为正整数n 的划分数。

输入

标准的输入包含若干组测试数据。每组测试数据是一个整数N(0 < N <= 50)。
输出
对于每组测试数据,输出N的划分数。

样例输入

5

样例输出

7
提示
5, 4+1, 3+2, 3+1+1, 2+2+1, 2+1+1+1, 1+1+1+1+1

解题思路

使用的是郭炜老师的课程,程序设计与算法二算法基础,第三周递归二,例题三放苹果的方法。把整数n当成是n个苹果放入n个盘子中,计算有多少中放法。

  1. 第一个递归的点是每次确定少使用一个盘子放苹果之后,剩下的盘子能有多少放苹果的方法。
  2. 第二个递归的点是确定好必须要使用的盘子的数量,那么先把每个盘子放入一个苹果,再计算将剩余的苹果再放进盘子有多少种方法。
  3. 由于盘子是不分顺序的,只算放了几个,所以当盘子数量大于苹果时,有多少种放法,等于盘子数量等于苹果时的放法的种数。所以当盘子数大于苹果数时,要返回盘子等于苹果数时的放法数。

代码实现

# include <iostream>

using namespace std; 

int IntegerDivide(int n, int m)
{
	if(m > n) return IntegerDivide(n , n); //第三点
	if(!n) return 1;
	if(!m) return 0;
	
	return IntegerDivide(n, m - 1) + IntegerDivide(n - m, m); //第一点和第二点
}

int main()
{
	int n;

	while(cin>>n) cout << IntegerDivide(n,n) <<endl;
	
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值