poj 1664 放苹果(递归)

来源:互联网 发布:怎样注册网站域名 编辑:程序博客网 时间:2024/06/06 04:46

题目: 将m个苹果放入n个篮子中,允许有篮子空着,请问一 共有几种放法?(注意:不能出现重复的放法)

输入: 第一行输入需要测试的次数t, 0<=t<=20。第二行输入苹果的数量m和篮子的数量n,1<=m,n<=10。

输出: 输出一共有几种放法。

试例: Input:
1
7 3
Output:
8

分析:   首先,苹果和篮子的关系一共有三种,m>n, m<n, m=n.m>n时:苹果放进篮子有两种情况,有空篮子和没有空篮 子。  有空篮子时,可以先规定有一个空篮子,则苹果的放法为placing(m,n-1),依次类推,就可得出该情况下共有几种 放法。    没有空篮子时,每个篮子至少有一个苹果,所以此时的放法为placing(m-n,n),即可得出该情况下有多少种放法。m<n时:因为苹果的数量小于篮子的数量,所以此时一定有空篮子。所以 此时的放法和n个苹果放进n个篮子是一样的,即placing(n,n)。m=n时: 此时也有两种情况,每个篮子里面都有一个苹果和至少有一个篮子时空的,所以此时的放法为placing(m,n-1)+1;
#include<iostream>using namespace std;int placing(int m,int n)    //计算共有几种放法{    if(m==1||n==1)//当只有一个苹果或只有一个篮子时,放法都是一种,即所有的苹果都放在同一个篮子里面    {        return 1;    }    else if(m>n)//当m>n时    {        return placing(m,n-1)+placing(m-n,n);        //有空篮子时的放法加上没有空篮子时的放法,有空篮子时先假设有一个空篮子后依次类推,没有空篮子时先每个篮子放一个,再将剩下的放进篮子    }    else if(m<n)    {        return placing(n,n);//m<n时的放法和n个篮子放n个苹果的放法相同    }    else if(m==n)    {        return 1+placing(m,n-1);//每个篮子放一个和至少有一个空篮子    }}int main(){    int m,n;    int t;    cin>>t;    for(int i=0;i<t;i++)    {        cin>>m>>n;        cout<<placing(m,n)<<endl;    }    return 0;}