吃糖果(复试刷题)

本文探讨了一道有趣的数学问题:如何计算吃完N块巧克力的不同方案数。通过递归和动态规划两种方法解决,展示了算法思维在日常生活问题中的应用。

心情:

今天看了一下计算机算法基础,居然觉得有点难的看懂,果然看书还是不怎么看的进去,打代码比较有兴趣。今天打了三个题目,比较基础,就这一道题觉得可以记一下笔记。

题目描述:

名名的妈妈从外地出差回来,带了一盒好吃又精美的巧克力给名名(盒内共有 N 块巧克力,20 > N >0)。 妈妈告诉名名每天可以吃一块或者两块巧克力。 假设名名每天都吃巧克力,问名名共有多少种不同的吃完巧克力的方案。 例如: 如果N=1,则名名第1天就吃掉它,共有1种方案; 如果N=2,则名名可以第1天吃1块,第2天吃1块,也可以第1天吃2块,共有2种方案; 如果N=3,则名名第1天可以吃1块,剩2块,也可以第1天吃2块剩1块,所以名名共有2+1=3种方案; 如果N=4,则名名可以第1天吃1块,剩3块,也可以第1天吃2块,剩2块,共有3+2=5种方案。 现在给定N,请你写程序求出名名吃巧克力的方案数目。

输入:

输入只有1行,即整数N

输出:

可能有多组测试数据,对于每组数据,
输出只有1行,即名名吃巧克力的方案数

如:

输入:

4

输出:

5

这道题不难,刚好今天学了关于递归的内容,一下子就想到了用递归的方法:
递归的变量:总的糖果数n
递归体:当你今天吃了一个糖果则剩下的糖果味n-1再进行递归,同理吃了两个糖果。。。。
递归出口:剩下一个糖果和没有糖果

代码如下

int eatchocolate(int n){

    if(n==0||n==1){
        return 1;
    }

    return eatchocolate(n-1)+eatchocolate(n-2);
}

再聊聊非递归

实际上这题用递归会重复的执行了n-2,n-3。。。等的情况,实际上我们可以用一个数组进行存储,即 a[i] 表示 i 个糖果的方案,a[0]=1,a[1]=1

然后实际上n大于等于2都是前两个相加,用个循环即可。
代码如下

int main()
{
   int n;
   cin>>n;

   if(n==1){
    cout<<1;
    return 0;
   }

   int a[20];
   a[0]=1;
   a[1]=1;

   for(int i=2;i<=n;i++){
        a[i]=a[i-1]+a[i-2];
   }

   cout<<a[n];
   return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值