分苹果

       把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




#include<iostream>
#include<algorithm>
using namespace std;
int apple(int x,int y)
{
    if(x==0||y==1)//x苹果,y盘子 
        return 1;
    if(x<y)
    {
        return  apple(x,x);
    }
    else
    {
        return apple(x,y-1)+apple(x-y,y);
    }
}
int main()
{
    int n,a,b;
    cin>>n;
    while(n--)
    {
       cin>>a>>b;
       cout<<apple(a,b)<<endl;
    }
    return 0;
}

 

 

x 苹果。y 盘子
讨论情况:
只有一个盘子,只有一种方案。
只有一个苹果,只有一种方案。
0个苹果。只有一种方案。
 

 

看着别人的代码。在else那想了半天才知道为啥。

如果苹果的数量大于盘子的。那么有f(n-m,m)表示先把每个盘子放一个。然后把n-m个苹果放到m个盘子里。这等价于每个盘子都放了苹果。f(n,m-1)便是当有一个空的盘子的放法。

 

posted on 2017-04-10 18:49  lnmark  阅读(68)  评论(0编辑  收藏  举报