poj 放苹果 1664

M个苹果放到N个盘子里有几种放法,允许有盘子空着

/** 
 * 
 *poj1664 
 * 自己还是想不到啊 
 * f(m, n) = f(m-n, n) + f(m, n-1) 
 * f(m, n): 把m个苹果放到n个盘子中的方法数 
 * f(m, n-1): 把m个苹果放到n-1个盘子中的方法数(其中至少有一个空盘子) 
 * f(m-n, n): 把m个苹果放到n个盘子中,而且每个盘子中都有苹果(先拿n个出来,等m-n个放好了,然后每个盘子放一个) 
 */ 
#include <stdio.h>
int f(int m,int n)
{
	if(m<0)   return 0;//m-n<0有些盘子不放苹果,已经包含在f(m,n-1); 
	if(m==0)  return 1;//n个盘子,刚好每个盘子放的个数都相同 
	if (n==1) return 1;//只剩下一个盘子就一种 
	return f(m-n,n)+f(m,n-1); 
}
int main(int argc, char *argv[])
{
	int m,n,t;
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d%d",&m,&n);
		printf("%d\n",f(m,n));
	}
	return 0;
}


 

你可能感兴趣的:(poj 放苹果 1664)