您的位置:首页 > 编程语言

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

2016-09-28 21:45 351 查看

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 无鞋童鞋。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: