题目要求:
把m个同样的苹果放在n个同样的盘子里,允许有得盘子空着不放,问共有多少种不同的方法。注意,5,1,1和1,5,1是一种分法。
解题思路:
设f(m,n)为m个苹果,n个盘子的放法数目,有两类不同的摆放方法:至少有一个盘子空着和所有盘子都不空。先对n作讨论,当n>m即盘子数多于苹果数时,必定有n-m个盘子是空着的,此时if(n>m),f(m,n)=f(m,m) 。当n大于m时,又分为两种情况,即至少有一个盘子空着和所有盘子都不空,前一种情况,至少有一个盘子空着,即有两个,三个,四个盘子空着,可以用递归实现,即f(m,n)=f(m,n-1),后一种情况是,一个盘子里可以先放一个苹果,再放剩下的苹果,即可以从每个盘子里拿走一个苹果,不影响最后的数目,即f(m,n)=f(m-n,n),两种情况加起来就是总的放法数目。
代码:
#include <stdio.h>
int f(int x,int y)
{
if(x==0||y==1)
return 1;
if(x<y)
return f(x,x);
else
return f(x,y-1)+f(x-y,y);
}
int main()
{
int t,m,n;
scanf("%d",&t);
while(t--)
{
scanf("%d %d",&m,&n);
printf("%d\n",f(m,n));
}
return 0;
}