放苹果

放苹果 

把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

题解+解析:

#include <stdio.h>  
#include <algorithm>  
#include <string.h>  
#include <iostream>  
#include <stdlib.h>  
/*分苹果,运用递归,确定边界。
1.当只有一个苹果的时候,有且只有一种放法。
2.当只有一个盘子的时候,有且只有一种放法。
3.因为盘子数与苹果数相等时可能会递归出苹果数为0的情况,所以需要考虑没有苹果的情况,而当没有苹果的时候,有且只有一种放法。
4.当盘子比苹果多的时候,多的盘子是没有用的,所以rec(app,tra)=rec(app,app)
5.当苹果比盘子多的时候,可分为两种情况,一种是没有空盘子rec(app-tra,tra),一种是至少有一个盘子rec(app,tra-1)。所以rec(app,tra) = rec(app-tra,tra) + rac(app,tra-1)。
*/
using namespace std;  
int rec(int app, int tra) //app为苹果的个数,tra为盘子数。 
{  
	if (app==0||app==1||tra==1)//1.当只有一个苹果的时候,有且只有一种放法。2.当只有一个盘子的时候,有且只有一种放法。3.因为盘子数与苹果数相等时可能会递归出苹果数为0的情况,所以需要考虑没有苹果的情况。而当没有苹果的时候,有且只有一种放法。
	{
		return 1;
	}
	else
	{
		if (tra > app)
		{
			return rec(app, app);//4.当盘子比苹果多的时候,多的盘子是没有用的,所以rec(app,tra)=rec(app,app)
		}
		else
		{
			return rec(app-tra, tra) + rec(app, tra-1);//5.当苹果比盘子多的时候,可分为两种情况,一种是没有空盘子rec(app-tra,tra),一种是至少有一个盘子rec(app,tra-1)。所以rec(app,tra) = rec(app-tra,tra) + rac(app,tra-1)。
		}
	}

}  

int main()
{
	int t;
	scanf("%d", &t);
	while (t--)
	{
		int m, n;
		scanf("%d%d",&m, &n);
		printf("%d\n", rec(m, n));
	}
	return 0;
}


posted @ 2018-04-11 22:32  focus5679  阅读(88)  评论(0编辑  收藏  举报