Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 37040 Accepted: 22806 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
<span style="color:#000000">1 7 3 </span>
Sample Output
<span style="color:#000000">8</span>
Source
因为1,2和2,1一样,暂时假设第i个盘子的东西>=第i+1个盘子的东西。则有
1.如果m=0,就只有一种方法(不放);如果n=1,也只有一种(全部放在一个盘子里)。
2.如果n>m,就一定会有m-n个盘子不放苹果,所有那些多出来的盘子可以不考虑,直接求m个盘子有多少种方法
3.除了上面两种情况,m个苹果,n个盘子有两种方法:最后一个盘子放OR不放 ;1.最后一个盘子放的话,前n-1一定也放了,暂且在第n个盘子放一个,那么方法数就等于solve(m-1,n);2.最后一个不放,则方法数为f(m,n-1)
#include <iostream>
#include <cstdio>
#include <cstring>
typedef long long LL;
using namespace std;
const int maxn=11;
LL solve(int m,int n)
{
if(m==0||n==1)
return 1;
if(n>m)
return solve(m,m);
return solve(m,n-1)+solve(m-n,n);
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int a,b;
scanf("%d%d",&a,&b);
printf("%lld\n",solve(a,b));
}
return 0;
}