皮皮扬爱吃芒果

 有一天,皮皮扬有钱了,就叫上了CC去吃一个榴芒,到了店里的时候,皮皮扬买了M个芒果班戟,她想把这些芒果班戟放在N个盘子里,允许盘子可以不放,不过皮皮扬的思维不好,不知道怎么放这些,现在就需要我们来帮皮皮扬算一下一共有多少种不同的分法?

输入

第一行是测试数据的数目t(0 <= t <= 20)。以下每行均包含二个整数M和N,以空格分开。1<=M,N<=10。

输出

对输入的每组数据M和N,用一行输出相应的K。

样例输入 复制

1
7 3

样例输出 复制

8

提示

5,1,1和1,5,1 是同一种分法。

  1. 这个用排列组合不适合做出来,很麻烦。
  2. 分情况讨论,写下递归条件
  3. 如果没有芒果或者说只有1个盒子,这个时候情况是1
  4. 如果盒子大于芒果的数量,那么多出来的空盒子情况刚好是和m个芒果装m个盒子情况是一样的,因为空盒子再多,装出来,也是一种情况
  5. 其他的情况就是我们放m-n个芒果,多出来的另外分配(是在每一个放好的情况上放m-n个芒果),加上每减少一个盒子分配芒果的情况个数。
  6. #include "stdio.h"
    long long slove(long long m,long long n)
    {
        if(m==0||n==1) return 1;
    	//没有芒果和只有一个盒子都是1
              
        if(n>m) return slove(m,m);
    	//如果盒子大于芒果,多出来的空盒子情况和刚好m个芒果装m个盒子情况一样是一样的情况
            
        return slove(m-n,n)+slove(m,n-1);
    	//第一个递归如果m>n需要考虑在放好的情况下,多出来的个数,
        //第二个递归是每次减少一个盒子所能装下的次数
    }
    int main()
    {
        long long m,n;
        int t,i;
        while(~scanf("%d",&t))
        {
            for(i=0;i<t;i++)
            {
                scanf("%lld%lld",&m,&n);
                printf("%lld\n",slove(m,n));
            }
        }
        return 0;
    }
    
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值