[C趣味编程]波瓦松分酒趣题
法国著名数学家波瓦松在青年时代研究过一个有趣的数学问题:假设某人有12品脱的啤酒一瓶,想从中倒出六品脱,但是恰巧身边没有6品脱的容器,仅有一个8品脱和一个5品脱的容器,怎样倒才能将啤酒分为两个6品脱呢?
?
解答:
?
这道题看了解题分析,没有看懂。。。待续
下面代码尚未完成后。
有个重要问题未解决:需要在递归的过程中,解决场景重复导致死循环的问题??
?
?
import com.sun.swing.internal.plaf.basic.resources.basic;public class FenJiu { static int[] Capacity = { 20, 8, 5 }; // 3个杯子的容量 static int[] Litre = { 12, 0, 0 }; // 3个杯子初始状态时水的升数 static int X = 6; // 最终要形成6升 public static void main(String[] args) { method(); } private static void method() { for (int e : Litre) { if (e == X) {// 只要有x升水形成,就成功。 return; } } dao(0, 1); dao(0, 2); dao(1, 0); dao(1, 2); dao(2, 0); dao(2, 1); } /** * M容量的杯子有水m升,N容量的杯子有水n升。<br> * 从M容量的杯子往N容量的杯子倒水。<br> * 要么m+n>N ,那么应该倒满N;<br> * 要么m+n<N ,那么应该倒空M。 */ private static void dao(int i, int j) { if (Litre[i] > 0 && Litre[j] < Capacity[j]) { if (Litre[i] + Litre[j] > Capacity[j]) { Litre[i] = Litre[i] + Litre[j] - Capacity[j]; Litre[j] = Capacity[j]; } else { Litre[i] = 0; Litre[j] = Litre[i] + Litre[j]; } } }}