代码随想录-2023/08/08

106 阅读1分钟

动态规划

416.分割等和子集

动态规划:

  1. 定义dp数组含义: dp[j]代表背包容量为j时的背包能装的最大价值
  2. 滚动数组, 升序遍历物品, 降序遍历背包

代码:

class Solution {
    public boolean canPartition(int[] nums) {
        // 本质是01背包问题
        // 偶数 + 偶数 == 偶数
        int n = nums.length;
        int sum = Arrays.stream(nums).sum();
        if(sum % 2 != 0) return false;
        // 找到一些数字使得其和等于 sum / 2
        int bagSize = sum >> 1;
        int[] dp = new int[bagSize + 1];
        for(int i=0; i<n; i++) {
            for(int j=bagSize; j>=nums[i]; j--){
                dp[j] = Math.max(dp[j], dp[j-nums[i]] + nums[i]);
            }
        }
        return dp[bagSize] == bagSize;
    }
}