• 动态规划算法-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];
        }
  • 相关阅读:
    求100-999之间所有的水仙花数
    验证用户密码程序
    【bzoj2002】[Hnoi2010]Bounce 弹飞绵羊 分块/LCT
    【bzoj1070】[SCOI2007]修车 最小费用流
    【bzoj3669】[Noi2014]魔法森林 Kruskal+LCT
    【bzoj3668】[Noi2014]起床困难综合症 贪心
    【bzoj1391】[Ceoi2008]order 网络流最小割
    【bzoj4873】[Shoi2017]寿司餐厅 最大权闭合图
    【bzoj1180】[CROATIAN2009]OTOCI LCT
    【bzoj3282】Tree LCT
  • 原文地址:https://www.cnblogs.com/use-D/p/13285898.html
Copyright © 2020-2023  润新知