穷举法-柏松分酒

来源:互联网 发布:ubuntu镜像文件安装 编辑:程序博客网 时间:2024/05/29 16:06
  1. /**
  2. * 穷举法:泊松分酒
  3. *
  4. * @author timmy1
  5. *
  6. */
  7. public class ShareWine {
  8. private int cup1 = 12;// 第一个杯子的容量
  9. private int cup2 = 8;// 第二个杯子容量
  10. private int cup3 = 5;// 第三个杯子容量
  11. private int result = 6;// 目标酒量
  12. // 假设有三个杯子,容量分别为: 12L,8L,5L,现在想通过这三个杯子得到6L酒。
  13. // 分酒的策略为从第一个杯子倒酒到第二个杯子,从第二个杯子倒酒到第三个杯子,从第三个杯子倒酒到第一个杯子-》循环
  14. // 每次倒酒都要倒满或者一个杯子全部倒空
  15. /**
  16. * @param w1
  17. * 第一个杯子当前的酒量
  18. * @param w2
  19. * @param w3
  20. */
  21. public void shareWine(int w1, int w2, int w3) {
  22. System.out.println("杯子1:" + w1 + " 杯子2: " + w2 + " 杯子3: " + w3);
  23. // 如果三个杯子其中有一个杯子的酒量为目标酒量->结束
  24. if (w1 == result || w2 == result || w3 == result) {
  25. return;
  26. }
  27. if (w2 != 0 && w3 != cup3) {// 第二个杯子倒酒到第三个杯子->第二个杯子要有酒,且第三个杯子没有倒满
  28. if (w2 + w3 <= cup3) {
  29. shareWine(w1, 0, w3 + w2);
  30. } else {
  31. shareWine(w1, w2 - (cup3 - w3), cup3);
  32. }
  33. } else if (w3 == cup3) { //第三个杯子往第一个杯子中倒酒 ->第三个杯子的酒倒满了
  34. if (w1 + w3 <= cup1) {
  35. shareWine(w1 + w3, w2, 0);
  36. } else {
  37. shareWine(cup1, w2, w3 - (cup1 - w1));
  38. }
  39. } else if (w2 == 0) {// 第一个杯子倒酒到第二个杯子->第二个杯子空了
  40. if (w1 >= cup2) {
  41. shareWine(w1 - cup2 , cup2, w3);
  42. } else {
  43. shareWine(0, w1, w3);
  44. }
  45. }
  46. }
  47. public static void main(String[] args) {
  48. ShareWine shareWine = new ShareWine();
  49. shareWine.shareWine(12, 0, 0);
  50. }
  51. }

结果打印:

杯子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



0 0