数据结构与算法 : 动态规划

经典的 0 1 背包问题: 给定几样物品, 每样物品都有不一样的价值, 同时重量也不一样, 求在一个能承受重量为W的背包中能装物品的最大价值 (大概就是这么描述)

相似的题目: https://www.luogu.org/problem/P1048 大概意思就是: 山谷里有几颗草药, 每一颗草药价值不一样, 采集花费时间也不一样, 求给定时间内能采集的草药的最大价值

Java解法:

    public static void main(String[] args) {
        Integer M = 3;  // 草药总数量
        Integer T = 70; // 能用的总时间

        Integer result = 0; // 最终总价值

        // 下面这两个数组必须要有0这一行, 因为要初始化
        int[] v = new int[]{0, 100, 1, 2}; // 草药价值
        int[] w = new int[]{0, 71, 69, 1}; // 所需时间

        // i为当前草药, j为当前剩余时间
        // 如果不采: state[i][j] = state[j-1][j]
        // 如果采:   state[i][j] = state[i-1][j-w[i]] + v[i]

        int[][] state = new int[M+1][T+1];

        for (int i = 1; i <= M; i++) {
            for (int j = 0; j <= T; j++) {
                if (j >= w[i]) { // 如果当前时间足够采集这颗草药 取采集或者不采当中价值大的那一个
                    state[i][j] = state[i-1][j] > state[i-1][j-w[i]] + v[i] ? state[i-1][j] : state[i-1][j-w[i]] + v[i];
                } else { // 否则不采
                    state[i][j] = state[i-1][j];
                }
                if (state[i][j] > result) {
                    result = state[i][j];
                }
            }
        }
        System.out.println("最大价值: " + result);
    }

动态规划的性能与 背包的重量或者说是这个题目当中的能用的总时间T有关系, 如果这个数太大的话, 动态规划的性能反而会大大下降

posted @ 2019-09-25 17:37  cccy0  阅读(199)  评论(0编辑  收藏  举报