0-1背包动态规划java版

167 阅读1分钟
class Solution {
    public int knapsack(int W, int N, int[] wt, int[] val) {
        // base case; 状态:背包容量、可选择的物品; 选择:装进背包,不装进背包
        // dp[i][j] 背包容量为j时,从第1到i件物品中做选择,所能获取的最大价值
        int[][] dp = new int[N + 1][W + 1];

        for (int i = 1; i < N + 1; i++) { // 状态:从第1件物品到第N件物品
            for (int j = 1; j < W + 1; j++) { // 状态:背包容量从1到W
                if (j - wt[i - 1] < 0) { // 这种情况下只能选择不装入背包
                    dp[i][j] = dp[i - 1][j];
                } else {
                    // 选择: 把第i件物品放入背包,或者不放入背包
                    dp[i][j] = Math.max(dp[i - 1][j - wt[i - 1]] + val[i - 1],
                                        dp[i - 1][j]);
                }

            }
        }
        return dp[N][W];
    }
}