算法学习3.3递归之放苹果

例题:放苹果

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

输入

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

输出

对输入的每组数据M和N,用一行输出相应的K。

样例输入

1
7 3

样例输出

8

解题思想

设i个苹果放在k个盘子里放法总数是 f(i,k),则:
k > i 时, f(i,k) = f(i,i)
k <= i 时,总放法 = 有盘子为空的放法+没盘子为空的放法,此时构造递归
f(i,k) = f(i,k-1) + f(i-k,k)
首先 f(i,k-1)形成递归,有盘子为空的情况刚好就是f(i,k-1),没盘子为空刚好就是先把k个盘各排一个,然后排剩下的i-k到k中,即 f(i-k,k)

代码块

#include<iostream>
using namespace std;
int f(int m,int n)//把m个苹果放进n个盘子的方法总数
{
	if(m<n) 
	    return f(m,m);//如果盘子数目多于苹果数,f(m,n)=f(m,m)
	if(m==0) 
	    return 1;//如果苹果数目为零,只有1种方法,下面每次m-n,必须把这里限制m
	if(n==0) 
	    return 0;//如果盘子为空,方法数为0,因为下面n每次减一,这里必须限制
	return f(m,n-1)+f(m-n,n);//有空盘和无空盘 ,上面两个等于0的情况就是来限制这里的边界条件
}
int main()
{
	int t,m,n;
	cin>>t;
	while(t--)
	{
		cin>>m>>n;
		cout<<f(m,n)<<endl;
	}
	return 0;
} 

发布了20 篇原创文章 · 获赞 1 · 访问量 159

猜你喜欢

转载自blog.csdn.net/weixin_42503072/article/details/104401044