Divide the pears
时间限制: 1 Sec 内存限制: 128 MB提交: 14 解决: 13
题目描述
Macro非常喜欢吃梨,有一天他得到了ACMICPC组委会送给他的一筐梨子。他比较心疼学生,就打算把梨子分给学生吃。现在他要把M个梨子放到N个盘子里面 (我们允许有的盘子为空) ,你能告诉Macro有多少种分法吗?
(请注意,如果有三个盘子,我们将5,1,1和1,1,5,视为同一种分法)
输入
第一行是一个整数t,代表有t组样例。
第二行有两个整数M 和 N 代表有M个梨和N个盘子。
输出
输出有多少种方法
样例输入
1
7 3
样例输出
8
题解:核心在于理解 sum(m,n-1)+sum(m-n,n);
前一部分表示盘子有空的,空的可以是一个两个至n-1个,所以依次类推就可以转化为m个苹果放在n-1,n-2......的盘子里。
后一部分表示所有盘子都有苹果,那么每个盘子苹果至少一个,就剩余m-n个苹果,问题就转化为了m-n个苹果放在你、个盘子的情况
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define CLR(a,b) memset(a,b,sizeof(a))
int sum(int m,int n)
{
if(m<0)
return 0;
if(m==0||m==1)
return 1;
if(n==0||n==1)
return 1;
return sum(m,n-1)+sum(m-n,n);
}
int main()
{
int m,n,u;
scanf("%d",&u);
while(u--)
{
scanf("%d%d",&m,&n);
printf("%d\n",sum(m,n));
}
return 0;
}