穷举法经典 (泊松分酒)
问题的来源:
某人有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代码如下:
扫描二维码关注公众号,回复:
9458725 查看本文章
/**
* 描述:泊松分酒 穷举法
*/
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);
}
}
}
}