在不允许借贷规则下,用递归思想实现啤酒问题(一定数量的空瓶与瓶盖可以兑换啤酒)(3.15)可扩展

需求:

啤酒问题:啤酒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瓶酒

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值