代码随想录算法训练营20期|第四十二天|动态规划part04|01背包问题,你该了解这些! ● 01背包问题,你该了解这些! 滚动数组 ● 416. 分割等和子集

01背包问题,你该了解这些! 

dp[i][j] 代表了从下标为[0, i]的物品里任意取,放进容量为j的背包,价值总和最大是多少。

不放物品i: 由dp[i - 1][j]推出,即背包容量为j, 里面不放物品i的最大价值,此时dp[i][j] = dp[i - 1][j],因为没有放i,背包价值和前面相同

放物品i: 由dp[i - 1][j - weight[i]]推出,dp[i - 1][j - weight[i]]为背包容量为j - weight[i]的时候不放物品i的最大价值,那么dp[i - 1][j - weight[i] + value[i]]就是放物品i得到的最大价值

dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - wight[i] + value[i]]

  •  01背包问题,你该了解这些! 滚动数组  

  •  416. 分割等和子集 
class Solution {
    public boolean canPartition(int[] nums) {
        if (nums == null || nums.length == 0) return false;
        int n = nums.length;
        int sum = 0;
        for (int num : nums) {
            sum += num;
        }
        if (sum % 2 != 0) return false;
        int target = sum / 2;
        int[] dp = new int[target + 1];
        for (int i = 0; i < n; i++) {
            for (int j = target; j >= nums[i]; j--) {
                dp[j] = Math.max(dp[j], dp[j - nums[i]] + nums[i]);
            }
            if (dp[target] == target) return true;
        }
        return dp[target] == target;
    }
}

你可能感兴趣的:(代码随想录二刷,算法,动态规划)