本文主要是介绍穷举法-柏松分酒,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
/**
* 穷举法:泊松分酒
*
* @author timmy1
*
*/
public class ShareWine {
private int cup1 = 12;// 第一个杯子的容量
private int cup2 = 8;// 第二个杯子容量
private int cup3 = 5;// 第三个杯子容量
private int result = 6;// 目标酒量
// 假设有三个杯子,容量分别为: 12L,8L,5L,现在想通过这三个杯子得到6L酒。
// 分酒的策略为从第一个杯子倒酒到第二个杯子,从第二个杯子倒酒到第三个杯子,从第三个杯子倒酒到第一个杯子-》循环
// 每次倒酒都要倒满或者一个杯子全部倒空
/**
* @param w1
* 第一个杯子当前的酒量
* @param w2
* @param w3
*/
public void shareWine(int w1, int w2, int w3) {
System.out.println("杯子1:" + w1 + " 杯子2: " + w2 + " 杯子3: " + w3);
// 如果三个杯子其中有一个杯子的酒量为目标酒量->结束
if (w1 == result || w2 == result || w3 == result) {
return;
}
if (w2 != 0 && w3 != cup3) {// 第二个杯子倒酒到第三个杯子->第二个杯子要有酒,且第三个杯子没有倒满
if (w2 + w3 <= cup3) {
shareWine(w1, 0, w3 + w2);
} else {
shareWine(w1, w2 - (cup3 - w3), cup3);
}
} else if (w3 == cup3) { //第三个杯子往第一个杯子中倒酒 ->第三个杯子的酒倒满了
if (w1 + w3 <= cup1) {
shareWine(w1 + w3, w2, 0);
} else {
shareWine(cup1, w2, w3 - (cup1 - w1));
}
} else if (w2 == 0) {// 第一个杯子倒酒到第二个杯子->第二个杯子空了
if (w1 >= cup2) {
shareWine(w1 - cup2 , cup2, w3);
} else {
shareWine(0, w1, w3);
}
}
}
public static void main(String[] args) {
ShareWine shareWine = new ShareWine();
shareWine.shareWine(12, 0, 0);
}
}
结果打印:
杯子1:12 杯子2: 0 杯子3: 0
杯子1:4 杯子2: 8 杯子3: 0
杯子1:4 杯子2: 3 杯子3: 5
杯子1:9 杯子2: 3 杯子3: 0
杯子1:9 杯子2: 0 杯子3: 3
杯子1:1 杯子2: 8 杯子3: 3
杯子1:1 杯子2: 6 杯子3: 5
这篇关于穷举法-柏松分酒的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!