先推荐一个放苹果各种情况合辑http://www.cnblogs.com/celia01/archive/2012/02/19/2358673.html
很精彩
排列组合题,可以列出递推式:
当m<n时,苹果比盘少,f(m,n)=f(m,m);
当m>=n时,f(m,n)=f(m,n-1)+f(m-n,n),分为以下2种情况:
1、无盘空:每个盘子至少放 1 个苹果,然后剩下的 m-n 个苹果随便放;f(m-n,n)
[当苹果比盘多且每个盘至少有一个苹果,此时放的方式种数=每个盘子拿去一个苹果的情况]
2、1盘空:有 1 个盘子没有放苹果,这样 m 个苹果随便放入 n-1 个盘子中;f(m,n-1)
递推函数中:
m<0时,有些盘不放苹果,已包括在f(m,n-1)的情况中,return 0;
m=0或n=1时,只有一种情况,return 1;
#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;
int f(int m,int n)
{
if(m<0||n==0)
return 0;
if(m==0||n==1)
return 1;
if(m<n)
return f(m,m);
else
return f(m,n-1)+f(m-n,n);
}
int main()
{
int t,m,n;
scanf("%d",&t);
while(~scanf("%d%d",&m,&n)&&t--)
printf("%d\n",f(m,n));
return 0;
}