放苹果
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 37377 | Accepted: 23016 |
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
对于m个苹果,n个盘子f(m,n):
如果m<n,那么就跟m个盘子,m个苹果是一样的f(m,m)。
如果m>n,那么有两种情况:一种有空盘子的情况,一种没有空盘子的情况,两种情况不重叠且加一起一定为情况总数。
第一种情况:m个苹果放在n-1个盘子里,因为至少有1个空盘子,即f(m,n-1)
第二种情况:每个盘子都至少有一个苹果,m-n个苹果再放到n个盘子里,即f(m-n,n)。
由上面两种情况得到递归式f(m,n)=f(m,n-1)+f(m-n,n)。
#include<iostream> #include<cstring> using namespace std; const int maxm=10000; int m[maxm],n[maxm],k[maxm];//m是苹果树,n是盘子数 int putApple(int m,int n) { if(m==0||n==1) return 1; else if(n>m) return putApple(m,m); else return putApple(m,n-1)+putApple(m-n,n); } int main() { memset(k,0,sizeof(k)); int t; cin>>t; for(int i=1;i<=t;i++)//一次性输入 { cin>>m[i]>>n[i]; } for(int i=1;i<=t;i++)//一次性输出 { k[i]=putApple(m[i],n[i]); cout<<k[i]<<endl; } return 0; }