21.解悶算法-雙蛋問題(dp)

雙蛋問題:

public class Egg {

 
    public static void main(String[] args) {
        int[][] a = new int[1][2];
        System.out.println(a.length);//1
        new Egg().dp(100);
    }

    //t層樓,2個蛋
    public void dp(int t) {
        //t層樓,n個雞蛋最多需要多少次
        int[][] a = new int[t + 1][3];

        //樓層數量一直在變化,只有1個雞蛋時候的扔法
        for (int i = 1; i < a.length; i++) {
            a[i][1] = i;
        }
        //只有1層樓,雞蛋數量一直在變化時候的扔法
        for (int i = 1; i < a[0].length; i++) {
            a[1][i] = 1;
        }
        //從只有2層樓的情況開始
        for (int i = 2; i <= t; i++) {

            int result = Integer.MAX_VALUE;
            //從第一層開始扔,一直有t中扔法
            for (int j = 1; j < i; j++) {
                //雞蛋碎了,還有j-1層樓(從第一層到第j層),1個雞蛋
                int timesA = a[j - 1][1] + 1;
                //雞蛋沒碎,還有i-j層樓,2個雞蛋
                int timesB = a[i - j][2] + 1;
                //樓層最不容易驗出來的情況下所需要扔的最大次數
                int bad = Math.max(timesA, timesB);
                //記錄選取最好的扔法
                result = Math.min(bad, result);
            }
            a[i][2] = result;
        }
    }
}

n蛋問題:

/**
 * N個蛋,T層樓高
 * 第一個蛋扔在第K層的時候
 * 1個蛋1層樓
 */
public class Egg {

    //t層樓,n個蛋
    public void dp(int t, int n) {
        //t層樓,n個雞蛋最多需要多少次
        int[][] a = new int[t + 1][n + 1];
        //1層樓,蛋的數量在變化
        for (int i = 1; i <= n; i++) {
            a[1][i] = 1;
        }
        //1個蛋,樓層在變化
        for (int j = 1; j <= t; j++) {
            a[j][1] = j;
        }
        //樓層在升高
        for (int t1 = 2; t1 < t + 1; t1++) {
            //蛋的數量在增加
            for (int n1 = 2; n1 < n + 1; n1++) {
                int min = Integer.MAX_VALUE;
                //從第1層開始扔
                for (int f = 1; f < t1; f++) {
                    //如果雞蛋沒碎,求解方程就是t1-f樓,n1個蛋的情況
                    int timesA = a[t1 - f][n1];
                    //如果雞蛋碎了,證明還有f-1層樓,n1-1個蛋的情況
                    int timesB = a[f - 1][n1 - 1];
                    //先取最壞情況需要探測的次數,在找到最好的樓層扔法
                    int bad = Math.max(timesA, timesB) + 1;
                    //計算最壞情況的最好解法
                    min = Math.min(min,bad);
                }
                //按樓層不變,蛋數遞增的情況一步步填充。
                a[t1][n1] = min;
            }
        }
        for (int i = 1; i < a.length; i++) {
            for (int j = 1; j < a[i].length; j++) {
                System.out.println(i+"層樓"+j+"個蛋的最好扔法需扔:"+a[i][j]+"次");
            }
        }

    }
    public static void main(String[] args){
        new Egg().dp(100,2);
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章