poj_1664_放苹果_解题报告

14 篇文章 0 订阅
8 篇文章 0 订阅

题目出处

----------------------------------------------------------------------------题目----------------------------------------------------------------------------

Description

把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。

Input

第一行是测试数据的数目t(0 <= t <= 20)。以下每行均包含二个整数M和N,以空格分开。1<=M,N<=10。

Output

对输入的每组数据M和N,用一行输出相应的K。
Sample Input
1
7 3
Sample Output
8

----------------------------------------------------------------------------题目结束-----------------------------------------------------------------------

解法:递归
思路(结合递归详述):

递归的作用在于把问题的规模不断缩少,直到问题缩少到能简单地解决
问:那么在这个问题上,如何减少问题规模呢?
答:这个问题有 m 个苹果和 n 个盘子,明显地,分别减少 m 和 n 的个数。就能达到把整个问题规模减少。而 m 的减少需要以盘子的个数为最少单位进行缩少。

新问题与原问题有着相同的形式
当缩少规模后,产生的新问题与原问题的意思是一样。也即新问题具有相同的形式:同样是求 m 个苹果放到 n 个盘子上的放法

递归的结束需要简单情景
问:这个问题的简单情景是什么?
答:随着不断进行向下递归,会产生如下的几种简单情景:
  1.  n = 1,盘子剩下一个,即只有一种放法; 
  2. m < 0,即存在空盘子。所以这种情况包含了在 n 不断减少的情况中; 
  3. m = 0,即苹果已经全放完,没有多余。所以这属于一种放法;

递归跳跃的信任
我们这里只需要思考:如何做能让问题规模减少、如何正确分析出简单情景即可。我们不需要去过多思考实现细节。

----------------------------------------------------------------------------代码----------------------------------------------------------------------------

#include <iostream>
using namespace std;
int fun(int m, int n)
{
	//当苹果已全部放满时
	if (m == 0) return   1;
	//当盘子剩下一个时
	if (n == 1) return   1;
	//当m<0时候的放法包含在fun(m,n-1)中
	if (m < 0)  return   0;

	return fun(m-n, n) + fun(m, n-1);
}
int main()
{
	int    t;
	int    m, n;
	cin >> t;
	while (t--)
	{
		cin >> m >> n;
		cout << fun(m, n) << endl;
	}
	return   0;
}




  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值