慢慢的,一点点的想,慢慢进行思考
1049. 最后一块石头的重量 II
此题虽是二刷,但仍有疑惑,依靠一句与416. 分割等和子集很像得以解题,思路如下:
为了得到最后一块石头,剩余的石头会进行互相抵消,则我们可以dp得到抵消数的最大值,最后得到last石头的重量。转念一想,这也就是求容量为总石头重量中的一半,能装下最大价值。
初始化数组:
dp = [0] * (m + 1)
遍历代码:
for x in stones:
if x > m:
continue
for i in range(m, x - 1, -1):
dp[i] = max(dp[i], dp[i - x] + x)
494. 目标和 (未想出版)
未发现的点:已经sum和target的情况下,正负数已经固定
此时只需要得到正数出现的次数即可
初始化数组:
dp = [0] * (m + 1)
遍历代码:
for x in stones:
if x > m:
continue
for i in range(m, x - 1, -1):
dp[i] = max(dp[i], dp[i - x] + x)
474.一和零
非常漂亮地解决,属于是二维的01背包,属于典型题
处理一下字符列表:
for x in strs:
zeros = 0
ones = 0
for y in x:
if y == '1':
ones += 1
else:
zeros += 1
s.append([zeros, ones])
初始化数组:
dp = [[0] * (n + 1) for _ in range(m + 1)]
遍历代码:
for x in s:
if x[0] > m or x[1] > n:
continue
for i in range(m, x[0] - 1, -1):
for j in range(n, x[1] - 1, -1):
dp[i][j] = max(dp[i][j], dp[i - x[0]][j - x[1]] + 1)