[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];
            }
        }
    }

}

你可能感兴趣的:(DAO,编程,C++,c,C#)