一:问题描述
啤酒2元一瓶,4个瓶盖换一瓶啤酒,2个空瓶换一瓶啤酒,问10元能喝几瓶啤酒?
二:问题分析
针对上述问题,分两种情况:一种是有剩余空瓶和瓶盖且不够兑换的情况;另一种是当剩余瓶盖或空瓶不够兑换时,老板可以配合凑够;我们分别来算出喝多少瓶啤酒。【结果为:喝完第15瓶时有剩余1个空瓶3个盖不够兑换;如果老板配合,喝20瓶啤酒正好无剩余瓶盖和空瓶】
三:程序实现
先实现一个啤酒类:
package com.challenge.beer; public class Beer { /** * 2元1瓶啤酒 * 4个盖子换1瓶酒 * 2个空瓶换1瓶酒 * 10元可以喝几瓶酒 */ public int Money; public int Gai; public int Empty; public int beer; public int borrowGai; public int borrowEmpty; int Count1=0,Count2=0; public Beer(int money, int gai, int empty, int beer) { super(); Money = money; Gai = gai; Empty = empty; this.beer = beer; } public Beer(int borrowGai, int borrowEmpty) { super(); this.borrowGai = borrowGai; this.borrowEmpty = borrowEmpty; } public void Drink(int money,int gai,int empty){//喝酒函数 if(money>0){ beer=money/2; Gai=money/2; Empty=money/2; }else{ Gai=gai; Empty=empty; } System.out.println("开始喝酒:瓶盖="+Gai+";空瓶="+Empty+";啤酒="+beer+"瓶"+"\n"); do{ if(Gai>=4){ int tmp1=Gai%4; int tmp2=(int)Gai/4; beer+=tmp2; Gai=tmp1+tmp2; Empty+=tmp2; Count1++; System.out.println("第"+Count1+"次瓶盖换酒:瓶盖="+Gai+";空瓶="+Empty+";啤酒="+beer+"瓶"+"\n"); } if(Empty>=2){ int tmp3=(int)Empty/2;//换酒 int tmp4=Empty%2;//剩余空瓶 Gai+=tmp3;//新盖 Empty=tmp4+tmp3; beer+=tmp3; Count2++; System.out.println("第"+Count2+"次空瓶换酒:瓶盖="+Gai+";空瓶="+Empty+";啤酒="+beer+"瓶"+"\n"); } System.out.println("喝了:"+beer+"瓶啤酒"+"\n"); //判断是否要还空瓶或者瓶盖 if(borrowGai >0||borrowEmpty>0){ Return(); } }while(Gai>=4 || Empty>=2); //借瓶盖或者空瓶函数 Borrow(); } public void Borrow(){//借瓶盖或者空瓶函数 if(Gai==0 && Empty==0){ System.out.println("-----OVER!喝酒结束---"); }else{ if(4-Gai>2-Empty ){ //判断借空瓶还是借盖,借最少优先 int tmp=2-Empty; Empty+=tmp; //借空瓶 this.borrowEmpty+=tmp; System.out.println("借了:"+this.borrowGai+"个盖;"+tmp+"个空瓶"+"\n"); Drink(0,Gai,Empty); }else{ int tmp=4-Gai; Gai+=tmp;//借盖 this.borrowGai+=tmp; System.out.println("借了:"+tmp+"个盖;"+"\n"); Drink(0,Gai,Empty); } } } public void Return(){//规还空瓶/瓶盖函数 //归还瓶盖 if(borrowGai>0){ if(Gai>0&&Gai>=borrowGai){ Gai-=borrowGai; System.out.println("归还:"+this.borrowGai+"个盖;"+"\n"); borrowGai=0; } } //归还空瓶 if(borrowEmpty>0){ if(Empty>=borrowEmpty){ Empty-=borrowEmpty; System.out.println("归还:"+this.borrowEmpty+"个空瓶"+"\n"); borrowEmpty=0; } } } }
再通过主类调用该类对象:
package com.challenge.beer; public class Main { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Beer p=new Beer(10,0,0,0); p.Drink(10,0,0); } }
三:程序输出结果
开始喝酒:瓶盖=5;空瓶=5;啤酒=5瓶
第1次瓶盖换酒:瓶盖=2;空瓶=6;啤酒=6瓶
第1次空瓶换酒:瓶盖=5;空瓶=3;啤酒=9瓶
喝了:9瓶啤酒
第2次瓶盖换酒:瓶盖=2;空瓶=4;啤酒=10瓶
第2次空瓶换酒:瓶盖=4;空瓶=2;啤酒=12瓶
喝了:12瓶啤酒
第3次瓶盖换酒:瓶盖=1;空瓶=3;啤酒=13瓶
第3次空瓶换酒:瓶盖=2;空瓶=2;啤酒=14瓶
喝了:14瓶啤酒
第4次空瓶换酒:瓶盖=3;空瓶=1;啤酒=15瓶
喝了:15瓶啤酒
借了:1个盖;
开始喝酒:瓶盖=4;空瓶=1;啤酒=15瓶
第4次瓶盖换酒:瓶盖=1;空瓶=2;啤酒=16瓶
第5次空瓶换酒:瓶盖=2;空瓶=1;啤酒=17瓶
喝了:17瓶啤酒
归还:1个盖;
借了:0个盖;1个空瓶
开始喝酒:瓶盖=1;空瓶=2;啤酒=17瓶
第6次空瓶换酒:瓶盖=2;空瓶=1;啤酒=18瓶
喝了:18瓶啤酒
归还:1个空瓶
借了:2个盖;
开始喝酒:瓶盖=4;空瓶=0;啤酒=18瓶
第5次瓶盖换酒:瓶盖=1;空瓶=1;啤酒=19瓶
喝了:19瓶啤酒
借了:2个盖;1个空瓶
开始喝酒:瓶盖=1;空瓶=2;啤酒=19瓶
第7次空瓶换酒:瓶盖=2;空瓶=1;啤酒=20瓶
喝了:20瓶啤酒
归还:2个盖;
归还:1个空瓶
-----OVER!喝酒结束---
本文出自 “催花雨” 博客,请务必保留此出处http://chenwen.blog.51cto.com/771416/1762473
原文:http://chenwen.blog.51cto.com/771416/1762473