【力扣416. 分割等和子集】dp(python3)

题目描述

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

思路题解

  • https://leetcode-cn.com/problems/partition-equal-subset-sum/solution/fen-ge-deng-he-zi-ji-by-leetcode-solution/
  • https://leetcode-cn.com/problems/partition-equal-subset-sum/solution/0-1-bei-bao-wen-ti-xiang-jie-zhen-dui-ben-ti-de-yo/
    两个题解差不多一个意思,要注意的是dp[0][0]=True的巧妙设计:
    【力扣416. 分割等和子集】dp(python3)_第1张图片
class Solution:
    def canPartition(self, nums: List[int]) -> bool:
        # d[i,j]代表[0,i]内选取若干个数,是否可以等于j。j小于等于总和的一半
        total=sum(nums)
        target=total//2
        if len(nums)<2 or total%2==1 or max(nums)>target:return False
        dp=[[False]*(target+1) for _ in range(len(nums))]
        dp[0][0],dp[0][nums[0]]=True,True #dp[i][j] = dp[i - 1][j] || dp[i - 1][j - nums[i]];target=j-nums[i]==0时,就说明单独的 nums[i] 这个数就恰好能够在被分割为单独的一组,其余的数分割成为另外一组
        for i in range(1,len(nums)):
            for j in range(target+1):
                if j==0:
                    dp[i][j]=True
                    continue
                if j<nums[i]:#不能选nums[i],,因为一个nums[i]已经大于j了
                    dp[i][j]=dp[i-1][j]
                else:
                    dp[i][j]=dp[i-1][j] or dp[i-1][j-nums[i]]
        return dp[len(nums)-1][target]

【力扣416. 分割等和子集】dp(python3)_第2张图片

你可能感兴趣的:(#,动态规划,leetcode,python,算法)