递归基础之放苹果
Time Limit: 1 Sec Memory Limit: 128 MB
Description
把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问 共有多少种不同的分法?
5,1,1和1,5,1 是同一种分法。
Input
第一行是测试数据的数目t(0 <= t <= 20)。以下每行均包含二个整 数M和N,以空格分开。1<=M,N<=20。
Output
对输入的每组数据M和N,用一行输出相应的K。
Sample Input
1
7 3
Sample Output
8
思路
对于对应的N和苹果和M个盘子,分为两种情况,一种是M的盘子全部放满,此时相当于现在M个盘子里面分别放好了一个苹果,;另一种情况则是盘子没有放满 所以公式为 :
F(n,m)=F(n,m−1)+F(n−m,m)
而如果盘子数多于苹果数,则:
F(n,m)=F(n,n)
#include<stdio.h>
int solve(int n, int m)
{
if(m == 1 || n == 0)
return 1;
if(m > n )
return solve(n,n);
else
return solve(n,m-1) + solve(n-m,m);
}
int main()
{
int N;
scanf("%d",&N);
int i = 0;
while (i < N)
{
int n,m;
scanf("%d %d",&n,&m);
printf("%d\n",solve(n,m));
i ++;
}
return 0;
}