网易2017校园招聘编程题——分苹果

1. 题目

  现商城买苹果,有8个一袋,6个一袋。小易想去买n个苹果(不能多也不能少),输出购买袋数最少的袋子个数,如果不能满足买n个苹果,则输出-1。
输入格式:
 买苹果个数n。
输出格式:
 苹果袋数或者-1。

2. 分析

  苹果每次分发有两种方法,8或者6。如果题目想要知道一共有多少种分法,我们大家肯定能想到用递归的方式。当然,本题类别只有两种,最多分发无非就三种情况,递归反而麻烦,但是第一感觉能想到用递归方法总是好的。回到本题,题目问的是:购买最少的袋数。重新考虑,因为我们在分配的时候当然希望8袋的情况越多越好,所以我们从最大能买8袋苹果的袋数考虑,然后看6袋苹果的袋数。如果不能满足正好买n个苹果,递减8袋苹果的袋数,直到正好买n个苹果为止。

3. C++实现程序

#include<iostream>

using namespace std;
int main()
{
    int nCon;
    int nEight =0;
    int nSix   =0;
    cin>>nCon;
    nEight = nCon /8;  //最大能买8袋苹果的袋数
    for(int i =nEight;i>=0;i--) //8袋苹果的袋数依次递减,直到满足情况为止。
    {
        if((nCon - nEight *8)%6 == 0)//正好匹配则输出结果
        {
            nSix = (nCon - nEight *8)/6;
            cout<<nSix+nEight<<endl;
            return 0;
        }       
    }       
    cout<<-1<<endl;
    return 0;
}

4. 问题延伸

  假设现在问能有多少种买法,最终输出买法个数,不能正好购买n个苹果则输出-1。
  因为最多就三种情况,要么全是8袋的,要么全是6袋的,要么两种情况都有。分情况考虑就行。
  但是如果用递归的思想怎么做呢?分两种情况,如果不换当前这种袋数的苹果(8或者6),那么会有多少种购买情况?如果换当前这种袋数的苹果,n-8或者n-6总数的苹果,下一步又有多少种购买方法?
  感兴趣的同学可以百度换硬币的问题,思路就是这个演变而来。
  代码如下:

#include<iostream>

using namespace std;
int nDem[2] ={6,8};  //两种情况
int GetKind(int nNum,int nKind)
{
        if(nNum == 0)//递归停止条件1
            return 1;
        if(nNum<0 || nKind==0 )//递归停止条件2
            return 0;
        return GetKind(nNum, nKind-1)+GetKind(nNum-nDem[nKind-1],nKind); //分包不包含6或者8考虑
}
int main()
{
    int nCon;
    int nAll=0;
    cin>>nCon;
    nAll = GetKind(nCon,2);
    if(nAll == 0)
        cout<<-1<<endl;
    else
        cout<<nAll<<endl;   
    return 0;
}

个人学习记录,由于能力和时间有限,如果有错误望读者纠正,谢谢!

转载请注明出处:CSDN 无鞋童鞋。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值