背包问题

/**
 * 背包问题
 * 有n件物品和一个最大承重为W的背包,每件物品的重量是w[i],价值是v[i],
 * 在保证总重量不超过 W 的前提下,选择某些物品装入背包,背包的最大总价值是多少?
 * 注意:每个物品只有一件,也就是每个物品只能选择 0 件或者 1 件
 */
public class Bag {
    public static int maxValue(int[] values, int[] weights, int max) {
        if (values == null || values.length == 0) {
            return 0;
        }
        if (weights == null || weights.length == 0) {
            return 0;
        }
        if (max <= 0) {
            return 0;
        }
        int dp[][] = new int[values.length + 1][max + 1];
        for (int i = 1; i <= values.length; i++) {
            for (int j = 1; j <= max; j++) {
                // 选中的物品重量
                int selectWeight = weights[i - 1];
                // 如果选择的物品的重量超过最大承重
                if (selectWeight > j) {
                    // 最大的价值 = 上一轮的最大价值(不选择该物品)
                    dp[i][j] = dp[i - 1][j];
                } else {
                    // 选择该物品
                    dp[i][j] = Math.max(dp[i - 1][j], values[i - 1] + dp[i - 1][weights[i - 1]]);
                }
            }
        }
        return dp[values.length][max];
    }

    public static void main(String[] args) {
        int[] values = {6, 3, 5, 4, 6};
        int[] weights = {2, 2, 6, 5, 4};
        int max = 10;
        System.out.println(maxValue(values, weights, max));
    }
}
posted @ 2022-05-10 18:57  wjxuriel  阅读(26)  评论(0)    收藏  举报