放苹果
放苹果
把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 Input1 7 3Sample 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;
}