放苹果
Time Limit: 1000MS Memory Limit: 10000K
Total Submissions: 31500 Accepted: 19849
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
考虑两种情况
1.盘子有两种状态,一种是放了苹果的,一种没放苹果,我们不妨考虑极端情况是苹果数如果是零,盘子均处于没放置苹果的状态,所以此时仅有一种排法,代码返回值为1;
2.当我的盘子只有一个时,无论有多少苹果,这仅有的一个盘子只处于一种状态,函数返回值为1;
有上面两种情况,用递归思想
再仔细想:
1.当苹果数x小于盘子数y,,总有(y-x)个盘子处于相同的状态(没放置苹果),我们考虑种数的时候便可以讲他们筛出去,即zzz(x,y)=zzz(x,x);
(重要)2.当我的苹果数x大于盘子数y,只有两种情况,一是所有盘子均放置了至少一个苹果,那我们此时从每个盘子中取出一个苹果,从总体情况看说是不影响他们的状态,不影响排法,还有一种情况是至少有一个盘子是没有放苹果的,这样能总结出一个公式
zzz(x,y)=zzz(x,y-1)+zzz(x-y,y);
递归:即我们从第二种情况递归,只到x==0||y==1的情况。
AC代码:
#include <stdio.h>
int zzz (int x,int y);
int main (){
int t,i,m,n;
scanf("%d",&t);
for (i=1;i<=t;i++){
scanf("%d%d",&m,&n);
printf("%d\n",zzz(m,n));
}
return 0;
}
int zzz (int x,int y){ //x 苹果 y 盘子
if(x==0||y==1)
return 1;
if(y>x)
return zzz(x,x);
else
return zzz(x,y-1)+zzz(x-y,y);
}