网易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 无鞋童鞋。
相关文章推荐
- 网易校园招聘2017编程题--回文数问题
- 网易2017校园招聘笔试题 买苹果
- 2017秋季网易校园招聘编程题和个人解答(python)
- 网易2017校园招聘数据挖掘笔试题编程题 分田地
- 网易2017校园招聘编程题——暗黑字符串
- 校园招聘-2017携程秋招后台开发笔试编程题
- 网易2017校园招聘笔试题:计算糖果
- 小米校园招聘 2017 编程题:号码分身
- 网易2017校园招聘笔试题:数字翻转
- 网易2018校园招聘编程题真题-[编程题] 交错01串
- 网易2018校园招聘编程题真题集合 (部分)
- 网易2018校园招聘编程题
- 网易2018校园招聘编程题真题集合1魔法币
- 网易2018校园招聘编程题真题-[编程题] 相反数
- 网易2017校园招聘笔试程序题(分田地)
- 算法爱好者——从数组找数字(网易2017校园招聘) ? 待解决
- 网易2017校园招聘笔试题 优雅的点
- 网易2017实习生招聘笔试题编程题(双核处理)
- 网易2018校园招聘编程题真题集合
- 网易2017秋招编程题之买苹果