需求:
啤酒问题:啤酒2元一瓶,4个盖子可以换一瓶,2个空瓶可以换一瓶,请问10元可以喝多少瓶?
思路:
定义消费啤酒总数量,剩余空瓶数,以及瓶盖数。
1.先买了再说,用+=记录消费的数量;
2.把盖子和瓶子换算成钱继续买,计算本轮总的盖子和瓶子数,记录换算的钱。
3.设置递归,如果换算的钱仍大于2,允许继续递归
代码
public class Test1 {
public static int totalNumber;//总消费的数量
public static int lastBottleNumber;//剩下瓶子数
public static int lastCoverNumber;// 剩下的盖子数
public static void main(String[] args) {
// 啤酒问题:啤酒2元一瓶,4个盖子可以换一瓶,2个空瓶可以换一瓶,请问10元可以喝多少瓶
buy(10);
System.out.println("总数:"+totalNumber);
System.out.println("剩余盖子数:"+lastCoverNumber);
System.out.println("剩余瓶子数:"+lastBottleNumber);
//不要借东西,口子不能开
}
public static void buy(int money){
//1.先买了再说
int buyNumber = money/2;
totalNumber +=buyNumber;//买了几瓶
//2.把盖子和瓶子换算成钱继续买
//计算本轮总的盖子和瓶子数
int allBottleNumber=buyNumber+lastBottleNumber;
int allCoverNumber=buyNumber+lastCoverNumber;
int allMoney=0;//记录换算的钱
if (allBottleNumber >=2){
allMoney += (allBottleNumber/2)*2;//瓶子换钱
}
lastBottleNumber=allBottleNumber%2;//记录还余下的瓶子
if (allCoverNumber >=4){
allMoney += (allCoverNumber/4)*2;//盖子换钱
}
lastCoverNumber=allCoverNumber%4;//
if (allMoney >=2){
buy(allMoney);//符合条件递归
}
}
}
结果是:消费总数:15瓶,剩余瓶盖3,剩余空瓶1。
扩展:
如果允许借贷,并且只要最后能还上,我想的结果是消费20瓶,剩余空瓶0,剩余瓶盖0。
因为给AI生成这个逻辑代码并不能理清,即使深度思考,得到的结果也是用户描述错误。我就文字解释吧,但是我还不太清楚怎么实现这个借贷的代码。
解释:
最后喝了15瓶酒,还剩下3个瓶盖,1个空瓶,仍旧可以利用借贷再进行兑换 。
借1个瓶盖得到1瓶新酒,喝完第16瓶酒将瓶盖归还,这时:喝了16瓶,还有2个空瓶,0个瓶盖。
然后2个空瓶继续兑换,此时喝了17瓶酒,还剩1个空瓶,1个瓶盖;
若再借1个空瓶,喝完第18瓶酒,再归还,此时还剩2个瓶盖,0个空瓶;
继续借2个瓶盖,喝完第19瓶,得到1个空瓶,-1个瓶盖;
再借一个空瓶,喝完第20瓶酒,刚好换完,剩余0个空瓶,0个瓶盖。
所以最后的结果是一共喝20瓶,然后0个空瓶,0个瓶盖。
想法:
因为买一瓶酒2元,得到一个空瓶喝一个瓶盖,2个空瓶或4个瓶盖换1瓶酒,所以空瓶为1元,瓶盖为0.5元,所以买酒只花0.5元。因此在各种借贷将空瓶和瓶盖转换为钱再买,全部花完,10/0.5=20瓶。因此最多能得到20瓶酒