放苹果

题目要求:

把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;
}


阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页