代码随想录二刷Day46
今日任务
139. 单词拆分
链接:https://leetcode.cn/problems/word-break/
func wordBreak(s string, wordDict []string) bool {
wordMap := make(map[string]bool)
for i := 0; i < len(wordDict); i++ {
wordMap[wordDict[i]] = true
}
dp := make([]bool, len(s) + 1)
dp[0] = true
//dp[j]为true时表示字符串的前j个字符串可以有字符串列表中的字符串组成
//外层遍历背包,内层检查
//这样可以保证每个背包在判断的时候都能充分利用物品
//比如对于applepenapple来说,顺序必须是applepenapple
//apple+apple+pen和pen+apple+apple都是不可以的
for i := 1; i <= len(s); i++ { //外层遍历背包
for j := 0; j < i; j++ { //内层检查
//dp[j]表示s[0~j-1]可以由字符串列表中的字符串组成
//所以接下来只需要判断s[j~i-1]是否可以由字符串列表中的字符串组成
//这个循环里的i,表示的是当前在字符串s的第几个位置(下标加1)
if dp[j] && wordMap[s[j:i]] { //这里算是遍历物品吧
dp[i] = true
break
}
}
}
return dp[len(s)]
}
多重背包
- 定义:有N种物品和容量为V的背包,第i种物品最多有Mi件可用,每件耗费的空间是Ci,价值是Wi,求解将哪些物品装入背包可使这些物品的耗费空间总和不超过背包容量,且价值总和最大。
- 本质:多重背包就是01背包的进阶版