1049. 最后一块石头的重量 II:
代码思路
二维数组,这道题的思路难点其实是怎么构建成背包问题。其实就是先构建成标准01背包问题,最后求出最后的最大价值,然后判断最后再判断这个最大价值和背包容量相减就可以。
class Solution:
def lastStoneWeightII(self, stones: List[int]) -> int:
# dp[i][j]表示前i块石头,在总容量为j时的最大价值是多少?
# 然后这个价值加起来有没有等于容量j?如果等,返回0,不等,差多少就是答案?
# 容量就是总和加起来除以2.
# 然后随便抽几个数,如果没超总和除以2,差多少呢?
# 差多少刚好就是答案!!!因为加法结合律!!!
dp = [[0 for i in range(sum(stones)//2+1)] for i in range(len(stones))]
dp[0][stones[0]:] = [stones[0]] * (len(dp[0])-stones[0])
for i in range(1, len(stones)):
for j in range(1, len(dp[0])):
if j >= stones[i]:
dp[i][j] = max(dp[i-1][j], dp[i-1][j-stones[i]]+stones[i])
else:
dp[i][j] = dp[i-1][j]
return sum(stones) - dp[len(stones)-1][-1] *2
494.目标和:
代码思路
这个好像不太像01背包
class Solution:
def findTargetSumWays(self, nums: List[int], target: int) -> int:
sumValue = sum(nums)
#注意边界条件为 target>sumValue or target<-sumValue or (sumValue + target) % 2 == 1
if abs(target) > sumValue or (sumValue + target) % 2 == 1: return 0
bagSize = (sumValue + target) // 2
dp = [0] * (bagSize + 1)
dp[0] = 1
for i in range(len(nums)):
for j in range(bagSize, nums[i] - 1, -1):
dp[j] += dp[j - nums[i]]
return dp[bagSize]
474. 一和零:
代码思路
本质还是01背包。只是上升到三维
class Solution:
def findMaxForm(self, strs: List[str], m: int, n: int) -> int:
value_list = [[0, 0] for i in range(len(strs))]
for i in range(len(strs)):
for j in range(len(strs[i])):
if strs[i][j] == "0":
value_list[i][0] += 1
else:
value_list[i][1] += 1
# return value_list
dp = [[[0 for k in range(n+1)] for j in range(m+1)] for i in range(len(strs))]
# 初始化,当第一个string的统计没超k和j的话。
dp[0] = [[1 if value_list[0][1] <= k and value_list[0][0] <= j else 0 for k in range(n+1)] for j in range(m+1)]
# return dp
# 第一个"01"的初始化,
for str_index in range(1, len(strs)):
for j in range(m+1):
for k in range(n+1):
if j - value_list[str_index][0] < 0 or k-value_list[str_index][1] < 0:
# 意味着加这个数的话m或n都超标了,所以这个数就不能加
dp[str_index][j][k] = dp[str_index-1][j][k]
else:
dp[str_index][j][k] = max(dp[str_index-1][j][k], dp[str_index-1][j-value_list[str_index][0]][k-value_list[str_index][1]]+1)
# j减去该strs[str_index]所含的0的个数,k减去该strs[str_index]所含的1的个数。
return dp[-1][m][n]