动态规划算法-3

挖金矿(背包问题)

    /**
     * RUN THIS
     */
    public static void main(String[] args) {
        System.out.println(d());
    }

    public static int d() {
        int[] person = {5, 5, 3, 4, 3};
        int[] gold = {400, 500, 200, 300, 350};
        int personCount = 10;
        int m = gold.length;
        int n = personCount;
        int[][] dp = new int[m][n];
        //推导公式
        //      挖最后一个矿:f(金矿数,总人数)=f(金矿数,总人数-person[n])+gold[n] ,解释:gold[n]为最后一个矿的金币数,person[n]为最后一个金矿需要的人数
        //      不挖最后一个矿:f(金矿数,总人数)=f(金矿数-1,总人数)
        //实际推到公式:f(金矿数,总人数)=Max( f(金矿数-1,总人数) , f(金矿数,总人数-person[n])+gold[n] )

        //初始化:为0的情况
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {//人数
                int goldPerson = person[i];
                int goldCount = gold[i];
                if (goldPerson > (j + 1)) {
                    dp[i][j] = 0;
                }
                if ((j + 1) >= goldPerson) {
                    dp[i][j] = goldCount;
                }
            }
        }
        print(dp);

        for (int i = 1; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (j >= person[i]) {
                    System.out.println("i=" + i + ";j=" + j + ";person[i]=" + person[i] + ";dp[i - 1][(j + 1) - person[i]]=" + dp[i - 1][j - person[i]]);
                    //推导公式
                    //      挖最后一个矿:f(金矿数,总人数)=f(金矿数,总人数-person[n])+gold[n] ,解释:gold[n]为最后一个矿的金币数,person[n]为最后一个金矿需要的人数
                    //      不挖最后一个矿:f(金矿数,总人数)=f(金矿数-1,总人数)
                    //实际推到公式:f(金矿数,总人数)=Max( f(金矿数-1,总人数) , f(金矿数,总人数-person[n])+gold[n] )
                    dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - person[i]] + gold[i]);
                }
            }
            print(dp);
        }
        return dp[m - 1][n - 1];
    }

 

posted @ 2020-07-11 22:33  使用D  阅读(137)  评论(0编辑  收藏  举报