poj-1664-放苹果

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

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


题目分析如下:

  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;
    }
    

    以此自励!

猜你喜欢

转载自blog.csdn.net/liubang00001/article/details/81335329