这道题实在是对于小白的我很难理解,分析如下:
我搜了很多解释,结果一个也看不懂,直到在想如何写这篇博客时,突然顿悟!原来起点我就是错的。我们想要让计算机按照我们的要求去执行命令,而我确是机械的看别人的代码,根本就是没有联系自己的想法。实在应该以此为戒。
题目分析如下:
- 令苹果的数目为m,盘子的数目为n,做一下解释
- 当n>m时,这时由于盘子的数目多,题中所述盘子的时相同的,多余的对于苹果的存放没有影响直接 return fab(m,m);
当n<=m时,这时由于苹果的数目多,因此,我的误区来了。现在我理解了,其实平常计算时首先也要从1-n把每种情况罗列一遍,相加之后就得到了结果。在这里假设所有的苹果已经在你的手中,盘子就在你的面前,首先我们分两种情况:
- 每个盘子中均放有苹果,如何去计算它所包含的情况呢?首先把每个盘子均放一个苹果,那么对于你手中苹果的递归计算就是这种情况的计算结果,此时的fab(m,n)=fab(m-n,n);最主要的就是理解这一步,我就是卡在了这里。
- 下一种情况不妨这样想,我们把盘子数为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; }
以此自励!