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

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

分析

  • 0-1背包问题,物品就是数组的元素,体积就是物品元素的大小,条件就是能达到特定的体积大小
  • 优化方案,右2维降低到1维度,然后再由1维度倒着计算
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]
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容