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;
}
个人学习记录,由于能力和时间有限,如果有错误望读者纠正,谢谢!