一个人有10元钱,买啤酒2元钱一瓶,两个啤酒瓶换一瓶,四个啤酒盖换一瓶,请问此人一个喝了多少瓶?

可以喝到15瓶或者20瓶,因为有两种计算方式,所以有两种结果

1、不许借的话,可以喝到15瓶:

第一轮,买5瓶,(得到5空瓶,5盖)

第二轮,可以换3瓶,(剩余4空瓶,4盖)

第三轮,可以换3瓶,(剩余3空瓶,3盖)

第四轮,可以换1瓶,(剩余2空瓶,4盖)

第五轮,可以换2瓶,(剩余2空瓶,2盖)

第六轮,可以换1瓶,(剩余1空瓶,3盖)

这样共喝到5+3+3+1+2+1=15(瓶)

2、允许借的话,可以喝到20瓶:

当然,如果想喝到理论的20瓶,需要老板好心,配合,愿意借瓶子和盖子才行。

因为从理论来算,剩下的1个瓶子,3个盖子还值2.5元,还能喝5瓶酒。
第一步借1个瓶子,借1个盖子,换2瓶酒,喝完后归还欠的瓶和盖,剩1个瓶子,1个盖子(喝2瓶)

第二步借1个瓶子,换1瓶酒,喝完后归还欠的瓶子,剩下2个盖子(喝1瓶)

第三步借2个盖子换1瓶酒,喝完后归还欠的盖子,还欠1个盖子,剩下1个瓶子(喝1瓶)

第四步借1个瓶子换1瓶酒,喝完后归还欠的瓶子盖子,两不相欠(喝1瓶)

这样,又能用1个瓶子和3个瓶盖,换5瓶啤酒,一起可以喝到20瓶啤酒。

扩展资料:

例:设酒为X,瓶为Y,盖为Z

可得出公式,2元=X+Y+Z

2元=2Y=4Z

故可算出,酒的价值为0.5元,瓶为1元,盖为0.5元。

三元一次方程是含有三个未知数并且未知数的的项的次数都是1的方程,也就是含有3个未知数的一次方程,其一般形式为ax+by+cz=d。

由多个一元一次方程组成并含有三个未知数的方程组叫做三元一次方程组,其求解方法一般为利用消元思想使三元变二元,再变一元。

解三元一次方程组的基本思想仍是消元,其基本方法是代入消元法和加减消元法。

步骤:

①利用代入法或加减法,消去一个未知数,得到一个二元一次方程组;

②解这个二元一次方程组,求得两个未知数的值;

③将这两个未知数的值代入原方程中含有三个未知数的一个方程,求出第三个未知数的值,把这三个未知数的值用一个大括号写在一起就是所求的三元一次方程组的解。

不许借的情况下,可以喝到15瓶的算法:

/**
     * 测试
     */
    public void test() {
        int count = changBeer(10, 2, 2, 4);
    }

    /**
     * 兑换啤酒
     *
     * @param money           当前的现金
     * @param price           啤酒价格
     * @param pingTOBeerCount 兑换一瓶酒所需要的瓶子数
     * @param gaiToBeerCount  兑换一瓶酒所需要的盖子数
     * @return 兑换到的啤酒总数
     */
    int changBeer(int money, int price, int pingTOBeerCount, int gaiToBeerCount) {
        if (money <= 0 || price <= 0 || money / price <= 0) {
            return 0;
        }
        //刚开始兑换到的啤酒数
        int startCount = money / price;
        //喝完啤酒后,剩余的瓶子数
        int leftPing = startCount;
        //喝完啤酒后,剩余的盖子数
        int leftGai = startCount;
        return __count(pingTOBeerCount, gaiToBeerCount, leftPing, leftGai, startCount);
    }

    int __count(int pingTOBeerCount, int gaiToBeerCount, int ping, int gai, int count) {
        
        if (ping < pingTOBeerCount && gai < gaiToBeerCount) {
            System.out.println("剩余的ping:" + ping + ",剩余的盖:" + gai + ",总共兑换的酒:" + count);
            return count;
        }

        int gaiToPing;
        //盖子数大于等于gaiToBeerCount时,开始兑换啤酒
        if (gai >= gaiToBeerCount) {
            gaiToPing = gai / gaiToBeerCount;
            gai = gai % gaiToBeerCount + gaiToPing;
            ping += gaiToPing;
            count += gaiToPing;
        }
        //瓶子数大于等于pingTOBeerCount时,开始兑换啤酒
        int pingToPing;
        if (ping >= pingTOBeerCount) {
            pingToPing = ping / pingTOBeerCount;
            ping = ping % pingTOBeerCount + pingToPing;
            gai += pingToPing;
            count += pingToPing;
        }
        //当前,兑换啤酒且喝完啤酒,进行下一轮兑换
        return __count(pingTOBeerCount, gaiToBeerCount, ping, gai, count);
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值