416. 分割等和子集

01背包

import java.util.Arrays;

class Solution {
    public boolean canPartition(int[] nums) {

        int sum = Arrays.stream(nums).sum();

        /**
         * 如果所有数的和为奇数,则不能平分
         */
        if (sum % 2 != 0){
            return false;
        }

        int target = sum / 2;

        /**
         * dp[j]定义为容量为j的背包中,能放入的最大数值和,最大值为target
         * 每个数字的价值和重量都是本身,初始化值都为0
         */
        int[] dp = new int[target + 1];

        for (int i = 0; i < nums.length; i++) {

            for (int j = target; j >= nums[i]; j--) {
                dp[j] = Math.max(dp[j], dp[j - nums[i]] + nums[i]);
            }

            /**
             * 剪枝
             * 如果已经找到了和等于target的子集,就不用继续找了
             */
            if (dp[target] == target){
                return true;
            }
        }

        return false;
    }
}

/**
 * 时间复杂度 O(n^2)
 * 空间复杂度 O(n)
 */

https://leetcode-cn.com/problems/partition-equal-subset-sum/

posted @ 2022-01-24 17:06  振袖秋枫问红叶  阅读(38)  评论(0)    收藏  举报