139. Word Break
dp[i] : 字符串长度为i的话,dp[i]为true,表示可以拆分为一个或多个在字典中出现的单词
如果([j, i] 这个区间的子串出现在字典里 && dp[j]是true) 那么 dp[i] = true
本题需要考虑顺序,所以先遍历背包,再遍历物品
class Solution:
def wordBreak(self, s: str, wordDict: List[str]) -> bool:
dp = [False] * (len(s) + 1)
dp[0] = True
for i in range(len(s) + 1): # 遍历背包
for j in range(0, i): # 遍历物品
subStr = s[j: i]
if subStr in wordDict and dp[j] == True:
dp[i] = True
return dp[len(s)]
多重背包
多重背包
多重背包每件物品最多有Mi件可用,把Mi件摊开,其实就是一个01背包问题了。
def test_multi_pack():
weight = [1, 3, 4]
value = [15, 20, 30]
nums = [2, 3, 2]
bagWeight = 10
# 转换为0-1背包
for i in range(len(nums)):
while nums[i] > 1:
weight.append(weight[i])
value.append(value[i])
nums[i] -= 1
dp = [0] * (bagWeight + 1)
for i in range(len(weight)): # 遍历物品
for j in range(bagWeight, weight[i] - 1, -1): # 遍历背包
dp[j] = max(dp[j], dp[j - weight[i]] + value[i])
print(dp[bagWeight])
test_multi_pack()