poj-1664-放苹果

文章讲述了作者在解决一个涉及苹果和盘子数量的问题时遇到的理解难题,重点在于递归算法的运用。当盘子多于苹果时,直接返回fab(m,m),否则通过递归计算fab(m,n-1)和fab(m-n,n)的和来获取所有可能。作者强调了理解问题和用自己的方式思考的重要性。
摘要由CSDN通过智能技术生成

这道题实在是对于小白的我很难理解,分析如下:

我搜了很多解释,结果一个也看不懂,直到在想如何写这篇博客时,突然顿悟!原来起点我就是错的。我们想要让计算机按照我们的要求去执行命令,而我确是机械的看别人的代码,根本就是没有联系自己的想法。实在应该以此为戒。


题目分析如下:

  1. 令苹果的数目为m,盘子的数目为n,做一下解释
  2. 当n>m时,这时由于盘子的数目多,题中所述盘子的时相同的,多余的对于苹果的存放没有影响直接 return fab(m,m);

当n<=m时,这时由于苹果的数目多,因此,我的误区来了。现在我理解了,其实平常计算时首先也要从1-n把每种情况罗列一遍,相加之后就得到了结果。在这里假设所有的苹果已经在你的手中,盘子就在你的面前,首先我们分两种情况:

  1. 每个盘子中均放有苹果,如何去计算它所包含的情况呢?首先把每个盘子均放一个苹果,那么对于你手中苹果的递归计算就是这种情况的计算结果,此时的fab(m,n)=fab(m-n,n);最主要的就是理解这一步,我就是卡在了这里。
  2. 下一种情况不妨这样想,我们把盘子数为n的排列结果计算出来后,由于盘子是可增减的,所以依次减去一个盘子来进行计算。则fab(m,n)=fab(m,n-1);依次递归之后就是我们所要找的所有的可能。此时return fab(m,n-1)+fab(m-n,n)就能计算出所有的结果了。

    代码如下(代码基本上和网上代码差不多,关键是理解):

    #include<iostream>
    #include<cstdio>
    using namespace std;
    int a,b,c;
    
    
    int bit(int a,int b){
        if(a==0||b==1){
            return 1;
        }
        if(b>a){
            return  bit(a,a);
        }
        if(a>=b){
           return bit(a,b-1)+bit(a-b,b);
        }
    }
    
    int main(){
        scanf("%d",&a);
        while(a--){
            scanf("%d%d",&b,&c);
            printf("%d\n",bit(b,c));
        }
    
    
        return 0;
    }
    

    以此自励!

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

旺旺的碎冰冰~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值