又几天没刷题了,看机器学习基础了。手生了,罪过罪过。最近需要刷一下动态规划,感觉很久没刷了,需要补补了。
好了,经典的背包问题,上题:
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]
好了。
以后复习要 代码/基础/项目 三管齐下啊!!!