提示:努力生活,开心、快乐的一天
动态规划
var wordBreak = function (s, wordDict) {
let dp = new Array(s.length+1).fill(false)
dp[0] = true
//先遍历背包,在遍历物品
for (let i = 0; i <= s.length; i++) {
for (let j = 0; j < wordDict.length; j++) {
if (i >= wordDict[j].length) {
if (s.slice(i - wordDict[j].length, i) === wordDict[j] && dp[i - wordDict[j].length]) {
dp[i] = true
}
}
}
}
console.log(dp)
return dp[s.length]
};
本题转化为背包问题,需要转化思路,要不然不容易想到
如果先遍历物品再遍历背包会有什么问题呢?
使用用例:s = “applepenapple”, wordDict = [“apple”, “pen”],对应的dp数组状态如下:
最后dp[s.size()] = 0 即 dp[13] = 0 ,而不是1,因为先用 “apple” 去遍历的时候,dp[8]并没有被赋值为1 (还没用"pen"),所以 dp[13]也不能变成1。
除非是先用 “apple” 遍历一遍,再用 “pen” 遍历,此时 dp[8]已经是1,最后再用 “apple” 去遍历,dp[13]才能是1。
无具体题目
题意:有N种物品和一个容量为V 的背包。第i种物品最多有Mi件可用,每件耗费的空间是Ci ,价值是Wi 。求解将哪些物品装入背包可使这些物品的耗费的空间 总和不超过背包容量,且价值总和最大。
多重背包和01背包是非常像的, 为什么和01背包像呢?
每件物品最多有Mi件可用,把Mi件摊开,其实就是一个01背包问题了。
多重背包在面试中基本不会出现,力扣上也没有对应的题目,大家对多重背包的掌握程度知道它是一种01背包,并能在01背包的基础上写出对应代码就可以了。
背包问题总结篇