Day46 | 139.单词拆分, 关于多重背包,你该了解这些!, 背包问题总结篇!
单词拆分
LeetCode题目:https://leetcode.cn/problems/word-break/
单词拆分也可以看作背包问题,同时属于可以反复取用某个物体的完全背包问题。主要的关键点在于对设定好的dp[i],含义为到达i位置以及之前组成的字符串能否满足拆分要求?因此需要设置合适的查询方法,即使用unordered_set容器来对物品进行排列和查找。
因此,由以上推理,问题可以化为对长度为i的子字符串,其中尾部i-j个字符串的可匹配的单词是否能找到。以及前方的j个字符组成的子串时候可以完成拼接。
代码如下:
class Solution {
public:
bool wordBreak(string s, vector<string>& wordDict) {
vector<bool> dp(s.size() + 1, false);
dp[0] = true;
unordered_set<string> wordSet(wordDict.begin(), wordDict.end());
for (int i = 0; i <= s.size(); i++) {
for (int j = 0; j <= i; j++) {
if (dp[j] == false) continue;
string temp = s.substr(j, i - j);
if(wordSet.find(temp) != wordSet.end() && dp[j])
dp[i] = true;
}
}
return dp[s.size()];
}
};
多重背包
多重背包的定义与01背包类似,唯一的差别在于其中的每个物体都存在一定的数量。因此解决起来简单的方法就是将多重背包转换为0-1背包问题,将每个物体的数量展开,然后在进行01背包的方法来处理即可。
背包总结
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6VWlPW75-1687771786267)(背包问题1.jpeg “背包问题总结”)]
片转存中…(img-6VWlPW75-1687771786267)]