放苹果

放苹果
Time Limit: 1000MS Memory Limit: 10000K
Total Submissions: 31500 Accepted: 19849
Description

把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
考虑两种情况
1.盘子有两种状态,一种是放了苹果的,一种没放苹果,我们不妨考虑极端情况是苹果数如果是零,盘子均处于没放置苹果的状态,所以此时仅有一种排法,代码返回值为1;
2.当我的盘子只有一个时,无论有多少苹果,这仅有的一个盘子只处于一种状态,函数返回值为1;
有上面两种情况,用递归思想
再仔细想:
1.当苹果数x小于盘子数y,,总有(y-x)个盘子处于相同的状态(没放置苹果),我们考虑种数的时候便可以讲他们筛出去,即zzz(x,y)=zzz(x,x);
(重要)2.当我的苹果数x大于盘子数y,只有两种情况,一是所有盘子均放置了至少一个苹果,那我们此时从每个盘子中取出一个苹果,从总体情况看说是不影响他们的状态,不影响排法,还有一种情况是至少有一个盘子是没有放苹果的,这样能总结出一个公式
zzz(x,y)=zzz(x,y-1)+zzz(x-y,y);
递归:即我们从第二种情况递归,只到x==0||y==1的情况。
AC代码:

#include <stdio.h>
int zzz (int x,int y);
int main (){
    int t,i,m,n;
    scanf("%d",&t);
    for (i=1;i<=t;i++){
        scanf("%d%d",&m,&n); 
        printf("%d\n",zzz(m,n));

    }   
return 0;   
}
int zzz (int x,int y){ //x 苹果  y 盘子 
    if(x==0||y==1)
        return 1;      
    if(y>x)
        return zzz(x,x);
    else
        return zzz(x,y-1)+zzz(x-y,y);

}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值