啤酒一瓶2元,二个空瓶可以换一瓶啤酒,四个瓶盖也可以换一瓶啤酒,现在有10元钱,可以最多喝几瓶啤酒

怎么写java程序实现下面的问题:
啤酒一瓶2元,二个空瓶可以换一瓶啤酒,四个瓶盖也可以换一瓶啤酒,现在有10元钱,可以最多喝几瓶啤酒

public static int Drink(int n,int d,int p,int total){
int drink = n>>1;
int leftd = d + drink%2;
int leftp = p + drink%4;
int s = drink>>1;
int f = drink>>2;
if(s>0||f>0){
total = Drink(drink, leftd, leftp,total);
}
return total + drink + s + f ;
}
public static void main(String[] args) {
System.out.println(Drink(10, 0, 0, 0));
}

少年 试试看看
public static int getbeer(int num)
{
int sum = num;//初始化总数
//瓶数大于等于2时,可以换
while(num>=2)

{
//新一次更换后总瓶数为更换前瓶数与瓶数/2的和
sum=sum+num/2;

//这是为了保证不会因为奇数瓶摩2少掉一个空瓶
if(num%2==1)

sum++;
num=num/2;
}
//这就是结果
return sum;

}

这道题根本没有编程的必要,因为它不具备普适性。
可以考虑把单价,钱,换取规则都作为输入,最终可以喝的啤酒瓶数作为输出。

方法内那么多变量会影响虚拟机执行效率 写注释是个好习惯 代码里不该出现实数的

 public class BeerGame {

    /**
     * 啤酒总数
     */
    private static int beerNum = 0;

    /**
     * 每次增加的啤酒数,包括购买的,用空瓶换取以及瓶盖换取
     */
    private static int addBeerNum = 0;

    /**
     * 当前空瓶数
     */
    private static int bottleNum = 0;

    /**
     * 当前瓶盖数
     */
    private static int libNum = 0;

    public static void main(String[] args) {
        //首次购买增加啤酒数
        addBeerNum = 10 >> 1;
        //啤酒数目增加后依次更改啤酒总数、当前空瓶数以及当前瓶盖数
        afterAddBeerNumChange(addBeerNum);
        //判断当前空瓶数或瓶盖数是否支持继续兑换
        while(bottleNum >= 2 || libNum >= 4){
            //空瓶数大于2时可兑换
            if (bottleNum >= 2) {
                //获取兑换啤酒数
                addBeerNum = bottleNum >> 1;
                //更改当前空瓶数
                bottleNum = bottleNum % 2;
                //修改啤酒总数、当前空瓶数以及当前瓶盖数
                afterAddBeerNumChange(addBeerNum);
            }
            //瓶盖数大于4时可兑换
            if (libNum >= 4) {
                //获取兑换啤酒数
                addBeerNum = libNum >> 2;
                //更改当前瓶盖数
                libNum = libNum % 4;
                //修改啤酒总数、当前空瓶数以及当前瓶盖数
                afterAddBeerNumChange(addBeerNum);
            }
        }
    }

    /**
     * 啤酒数目增加后操作,依次更改啤酒总数、当前空瓶数以及当前瓶盖数
     * @param addBeerNum 增加啤酒数
     */
    private static void afterAddBeerNumChange(int addBeerNum){
        beerNum += addBeerNum;
        bottleNum += addBeerNum;
        libNum += addBeerNum;
        System.out.println("beerNum = " + beerNum + " bottleNum = " + bottleNum + " libNum = " + libNum);
    }
}

欢迎批评指正

 /**     
     * 
     * * @param args     
     */ 
    public static int all = 5;  
    public static int leftBottle;   
    public static int leftTop;  

    public static void main(String[] args) {        
        all += drink(5,5);      
        System.out.println("总共能喝"+all);     
        System.out.println("剩下酒瓶个数"+leftBottle);        
        System.out.println("剩下盖子个数"+leftTop);   
    }   

    public static int drink(int bottle, int top) {      
        if(bottle >=2 || top >=4){          
            leftBottle = (bottle/2) + (bottle%2) + (top/4);         
            leftTop = (top/4) + (top%4) + (bottle/2);           
            return  (bottle/2) + (top/4) + drink(leftBottle,leftTop);       
        }       
        return 0;   
    }

在网上看到的一个解决方法,我觉得挺棒的

public static int drink(int d,int p,int total){
int leftd = d%2; //剩余空瓶数
int leftp = p%4; //剩余瓶盖数
int s = d>>1; //空瓶兑酒数
int f = p>>2; //空盖兑酒数
if(s>0||f>0){
total = drink(leftd+s+f, leftp+s+f,total);
}
return total + s + f ;
}
public static int input(int n){
return drink( n>>1, n>>1, n>>1);
}
public static void main(String[] args) {
System.out.println(input(10));
}