poj 1664 放苹果(递归)

该博客讨论了如何用递归算法解决将一定数量的苹果分配到多个篮子里的问题,其中允许篮子为空,且不考虑重复的分配方式。给出的例子展示了当有7个苹果和3个篮子时,共有8种不同的分配方法。

题目: 将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;
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值