416. 分割等和子集(中等)-动态规划

2023-06-01  本文已影响0人  MatrixZ

给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等

分析

class Solution:
    def canPartition(self, nums: List[int]) -> bool:
        # 0-1背包问题
        all_sum = sum(nums)
        if all_sum % 2 == 1: return False

        target = all_sum // 2
        n = len(nums)
        dp = [False for _ in range(target + 1)]
        dp[0] = True


        for i in range(1, n + 1):
            num = nums[i-1]
            # 陷阱1,需要倒着计算
            # 优化方案路线,先变成1维,然后再变成倒着计算
            for j in range(target, num - 1, -1):
                dp[j] = dp[j] or dp[j - num]

        return dp[target]
上一篇 下一篇

猜你喜欢

热点阅读