穷举法经典 泊松分酒

穷举法经典 (泊松分酒)

问题的来源:
某人有8公升酒,想把一半赠给别人,但没有4公升的容器,只有一个3公升和一个5公升的容器。利用这两个容器,怎样才能用最少的次数把8公升酒分成相等的两份?

1)将8 公升酒倒入小容器,倒满后,把小容器的酒全部倒入盛5公升的容器中。

(2)再倒满小容器,将小容器的酒再向5公升容器倒,使它装满酒,此时小容器内只剩1公升酒。

(3)将5公升容器中的酒全部倒回盛8公升的酒瓶中,接着把小容器中的1公升酒倒入这时的空容器中。

(4)再把酒瓶中的酒倒满小容器,酒瓶中剩下的酒整好是8公升的一半。

解决泊松分酒问题;
自己规定 先酒杯1给酒杯2倒,然后酒杯2向酒杯3倒,最后酒杯3向酒杯1到。

1,如果酒杯1的酒不为0并且酒杯2的酒不是满的,就往酒杯2中倒,会有两个问题,酒杯1的酒加上酒杯2的酒是否可以把酒杯2加满,然后进行递归,

2,如果酒杯2的酒不为0并且酒杯3的酒不是满的,就往酒杯3中倒,会有两个问题,酒杯2的酒加上酒杯3的酒是否可以把酒杯3加满,然后进行递归

3,如果酒杯3的酒不为0并且酒杯1的酒不是满的,就往酒杯1中倒,会有两个问题,酒杯1的酒加上酒杯3的酒是否可以把酒杯1加满,然后进行递归.

递归出口就是酒杯1或者酒杯2或者酒杯3,其中一个酒杯的酒等于所要得到的酒,就递归结束,如果出现异常,说明无论如何都得不到所要得到的酒。

java代码如下:

/**
 * 描述:泊松分酒   穷举法
 */
public class BackBottle {
    static int b1 = 12;//瓶子1
    static int b2 = 9;//瓶子2
    static int b3 = 4;//瓶子3
    static int m = 8;//要得到的结果

    public static void main(String[] args) {
        backBottle(12, 0, 0);
    }

    private static void backBottle(int bb1, int bb2, int bb3) {
        System.out.println("bb1: " + bb1 + " bb2: " + bb2 + " bb3: " + bb3);
        if (bb1 == m || bb2 == m || bb3 == m) {
            System.out.println("可以得到酒:" + m);
            return;
        }
        //b1向b2中倒酒
        if (bb2 != b2 && bb1 != 0) {
            //b2酒满
            if (bb2 + bb1 >= b2) {
                backBottle(bb1 - (b2 - bb2), b2, bb3);
            } else {
                backBottle(0, bb2 + bb1, bb3);
            }
            //b2向b3倒酒
        } else if (bb3 != b3 && bb2 != 0) {
            if (bb3 + bb2 >= b3) {
                backBottle(bb1, bb2 - (b3 - bb3), b3);
            } else {
                backBottle(bb1, 0, bb2);
            }
        } else if (bb1 != b1 && bb3 != 0) {
            if (bb3 + bb1 >= b1) {
                backBottle(b1, bb2, bb3 - (b1 - bb1));
            } else {
                backBottle(bb1 + bb3, bb2, 0);
            }
        }
    }

}

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值