【原创】10元买啤酒2个空瓶换一瓶4个瓶盖换一瓶经典算法

转载请注明出处:http://blog.csdn.net/li396864285/article/details/51519786

【原创】10元买啤酒2个空瓶换一瓶4个瓶盖换一瓶,经典算法原题目:10元钱去买啤酒,2个空瓶可兑换一瓶,4个瓶盖可兑换一瓶,请问总共能喝多少瓶?

</pre><pre code_snippet_id="1699391" snippet_file_name="blog_20160527_1_8970255" name="code" class="java">//10元钱买5瓶啤酒,2个瓶盖换一瓶,4个空瓶换一瓶,10钱到底能买多少瓶啤酒?
/**
 * Created by lee on 2016/5/27.
 */
public class BottleTest {
    public static void main(String[] args){
        int yourMoney = 10;
        TurnBeerInfo turnBeerInfo = new TurnBeerInfo();
        buyBeer(turnBeerInfo,yourMoney);
        int i = 0;
        while(turnBeerInfo.bottleNum>=2||turnBeerInfo.coverNum>=4){
            compute(turnBeerInfo,++i);
        }
        System.out.println("总共喝过"+turnBeerInfo.drinkSumNum+"瓶啤酒,还剩下"+turnBeerInfo.bottleNum+"个瓶子,"
                +turnBeerInfo.getCoverNum()+"个瓶盖");
    }

    public static void buyBeer(TurnBeerInfo turnBeerInfo,int money){
        int beerNum = money/2;
        turnBeerInfo.drinkSumNum = beerNum;
        turnBeerInfo.bottleNum = beerNum;
        turnBeerInfo.coverNum = beerNum;
    }

    public static void compute(TurnBeerInfo turnBeerInfo,int i){
        System.out.println("第"+i+"次兑换,您目前总共喝过"+turnBeerInfo.drinkSumNum+"瓶啤酒,还剩下"+turnBeerInfo.bottleNum+"个瓶子,"
                +turnBeerInfo.getCoverNum()+"个瓶盖");
        if(turnBeerInfo.bottleNum/2>0){
            int bottleTurnNum =turnBeerInfo.bottleNum/2;//用瓶子兑换了bottleTurnNum瓶酒,又产生了bottleTurnNum个瓶子,bottleTurnNum个盖子
            turnBeerInfo.drinkSumNum += bottleTurnNum;//1:累加喝过啤酒总数
            turnBeerInfo.coverNum += bottleTurnNum;//2:累加瓶盖数量
            turnBeerInfo.bottleNum = turnBeerInfo.bottleNum%2+bottleTurnNum;//3:重新计算剩余瓶子数量,请记得把刚兑换的酒产生的瓶子,也及时累加
        }
        if(turnBeerInfo.coverNum/4>0){
            int coverTurnNum = turnBeerInfo.coverNum/4;//用盖子兑换了coverTurnNum瓶酒,又产生了coverTurnNum个瓶子,coverTurnNum个盖子
            turnBeerInfo.drinkSumNum += coverTurnNum;//1:累加喝过啤酒总数
            turnBeerInfo.bottleNum += coverTurnNum;//2:累加瓶子数量
            turnBeerInfo.coverNum = turnBeerInfo.coverNum%4+coverTurnNum;//3:重新计算剩余瓶盖数量,请记得把刚兑换的酒产生的盖子,也及时累加
        }
        return ;
    }
    public static class TurnBeerInfo{
        private int bottleNum;//剩余瓶子数量,2个瓶子可换1瓶啤酒
        private int coverNum;//剩余的盖子数量,4个盖子可换1瓶啤酒
        private int drinkSumNum;

        public int getBottleNum() {
            return bottleNum;
        }
        public void setBottleNum(int bottleNum) {
            this.bottleNum = bottleNum;
        }
        public int getCoverNum() {
            return coverNum;
        }
        public void setCoverNum(int coverNum) {
            this.coverNum = coverNum;
        }
        public int getDrinkSumNum() {
            return drinkSumNum;
        }
        public void setDrinkSumNum(int drinkSumNum) {
            this.drinkSumNum = drinkSumNum;
        }
    }

}

请参考以上代码,其中关键点是计算时,第3步骤,一定记得把刚兑换的酒产生的瓶子和盖子放入余数中。

现在,你可以很清楚地知道,当你有10元钱,你最多可以喝多少瓶:

第1次兑换,您目前总共喝过5瓶啤酒,还剩下5个瓶子,5个瓶盖
第2次兑换,您目前总共喝过8瓶啤酒,还剩下4个瓶子,4个瓶盖
第3次兑换,您目前总共喝过11瓶啤酒,还剩下3个瓶子,3个瓶盖
第4次兑换,您目前总共喝过13瓶啤酒,还剩下3个瓶子,1个瓶盖
第5次兑换,您目前总共喝过14瓶啤酒,还剩下2个瓶子,2个瓶盖

总共喝过15瓶啤酒,还剩下1个瓶子,3个瓶盖

假如你有12元,最多可以喝到多少瓶:

第1次兑换,您目前总共喝过6瓶啤酒,还剩下6个瓶子,6个瓶盖
第2次兑换,您目前总共喝过11瓶啤酒,还剩下5个瓶子,3个瓶盖
第3次兑换,您目前总共喝过14瓶啤酒,还剩下4个瓶子,2个瓶盖
第4次兑换,您目前总共喝过17瓶啤酒,还剩下3个瓶子,1个瓶盖
第5次兑换,您目前总共喝过18瓶啤酒,还剩下2个瓶子,2个瓶盖

总共喝过19瓶啤酒,还剩下1个瓶子,3个瓶盖

很神奇吧。

点赞