问题大概描述:矿泉水1块钱1瓶,喝完以后,2个空瓶子可以换一瓶新矿泉水,4个瓶盖也可以换一瓶新矿泉水。问:花10块钱最后最多能得多少瓶矿泉水。
钱不是问题,主要是考虑刚开始能买多少瓶矿泉水,这里是10瓶,既然写程序,就n瓶吧。
大致思路如下:
先把n个矿泉水全部拆分成空瓶和盖子,就是当前拥有的所有的空瓶和盖子。
可以用while循环,结束条件是(经过一轮瓶子和瓶盖的兑换活动后)当前的兑换后的所有瓶盖和瓶子都不足以再次兑换新矿泉水。
循环:1.瓶盖和空瓶用来兑换矿泉水
2.先用瓶盖兑换m1个矿泉水
3.再用空瓶兑换m2个矿泉水
4.整理当前拥有所有的瓶盖数,空瓶数,以及累积的矿泉水总数:矿泉水总数+m1+m2,瓶盖总数 - m1*4 + m1+m2 ,空瓶总数 - m2*2 +m1+m2;
代码如下,输入初始啤酒数目,返回最终数目。
以下是while循环解决方法:
题中的beer是指的啤酒,矿泉水啤酒都一样。
int maxBox(int beerNum){int allBox = beerNum;int allGai = beerNum;int allBeer = beerNum;while(allBox >= 2 || allGai >= 4){int x = allBox % 2;int y = (allBox - x) / 2;int a = allGai % 4;int b = (allGai - a) / 4;allBox = x + y + b;allGai = a + b + y;allBeer += y + b;}return allBeer;}
还要一个递归解决方法,其实思维上来看也不算递归,就是while循环的一个变形,刚好研究递归,就顺便写着玩玩。
int maxBox_recursion(int allBox,int allGai,int allBeer){if(allBox < 2 && allGai < 4){return allBeer;}else{int x = allBox % 2;int y = (allBox - x) / 2;int a = allGai % 4;int b = (allGai - a) / 4;allBox = x + y + b;allGai = a + b + y;allBeer += y + b;return maxBox_recursion(allBox,allGai,allBeer);}}
如果觉得《关于矿泉水空瓶子和瓶盖兑换矿泉水的问题解决算法》对你有帮助,请点赞、收藏,并留下你的观点哦!