跟着专注于计算机视觉的AndyJ的妈妈我学算法之每日一题leetcode416分割等和子集

又几天没刷题了,看机器学习基础了。手生了,罪过罪过。最近需要刷一下动态规划,感觉很久没刷了,需要补补了。
好了,经典的背包问题,上题:

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

注意:

每个数组中的元素不会超过 100
数组的大小不会超过 200
示例 1:

输入: [1, 5, 11, 5]

输出: true

解释: 数组可以分割成 [1, 5, 5] 和 [11].
 

示例 2:

输入: [1, 2, 3, 5]

输出: false

解释: 数组不能分割成两个元素和相等的子集.

背包问题还是很经典的,好好写,想一下。
好了,code:

class Solution:
    def canPartition(self, nums: List[int]) -> bool:
        n = sum(nums)
        if n%2 != 0: return False
        m = n//2
        dp = [[False for _ in range(m+1)] for _ in range(len(nums)+1)]
        for i in range(len(nums)+1):
            dp[i][0] = True # 背包没容量,所以是装满的
        
        for i in range(1, len(nums)+1):
            for j in range(1, m+1):
                if j-nums[i-1]<0:
                    # 装不下
                    dp[i][j] = dp[i-1][j]
                else:
                     # 不装 / 装
                    dp[i][j] = (dp[i-1][j] or dp[i-1][j-nums[i-1]])
        return dp[-1][-1]

好了。
以后复习要 代码/基础/项目 三管齐下啊!!!

你可能感兴趣的:(leetcode)