力扣-416.分割等和子集

题目链接

416.分割等和子集

class Solution {
    public boolean canPartition(int[] nums) {
        int sum = 0;
        for (int i = 0; i < nums.length;  i++) {
            sum += nums[i];
        }
        if (sum % 2 == 1)
            return false;
        int target = sum / 2;
        // dp[i]表示:背包容量为i时,能装的最大子集和 
        int[] dp = new int[target + 1];
        for (int i = 0; i < nums.length;  i++) {  
            for (int j = target; j >= 0; j--) {
                if (j - nums[i] >= 0) {
                    // 更新dp[j]:比较不放入当前数字和放入当前数字两种情况 
                    dp[j] = Math.max(dp[j],  dp[j - nums[i]] + nums[i]);
                }
            }
        }
        return dp[target] == target;
    }
}

小结:01背包问题,先遍历物品,再遍历背包,逆序遍历背包,确保每个数组只用一次。如[1,2,3]target=4,正序遍历会误认为41可以凑出4

你可能感兴趣的:(力扣-416.分割等和子集)