今日任务
- 139.单词拆分
- 关于多重背包,你该了解这些!
- 背包问题总结篇!
关于多重背包,力扣上没有相关的题目,所以今天大家的重点就是回顾一波自己做的背包题目吧。
139.单词拆分
题目链接:
https://leetcode.cn/problems/word-break/description/
题目描述:
给你一个字符串 s
和一个字符串列表 wordDict
作为字典。请你判断是否可以利用字典中出现的单词拼接出 s
。
**注意:**不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。
示例 1:
输入: s = "leetcode", wordDict = ["leet", "code"]
输出: true
解释: 返回 true 因为 "leetcode" 可以由 "leet" 和 "code" 拼接成。
示例 2:
输入: s = "applepenapple", wordDict = ["apple", "pen"]
输出: true
解释: 返回 true 因为"applepenapple" 可以由"apple" "pen" "apple" 拼接成。
注意,你可以重复使用字典中的单词。
示例 3:
输入: s = "catsandog", wordDict = ["cats", "dog", "sand", "and", "cat"]
输出: false
提示:
1 <= s.length <= 300
1 <= wordDict.length <= 1000
1 <= wordDict[i].length <= 20
s
和wordDict[i]
仅有小写英文字母组成wordDict
中的所有字符串 互不相同
题解代码:
class Solution {
public:
//二刷复习动规
bool wordBreak(string s, vector<string>& wordDict){
unordered_set<string> wordSet(wordDict.begin(), wordDict.end()); //将词典中的词放入一个set中
vector<bool> dp(s.size()+1, false); //dp数组,dp[i]表示:
//字符串长度为i的话,dp[i]为true,表示可以拆分为一个或多个在字典中出现的单词
dp[0] = true; //初始化
for(int i = 1; i <= s.size(); i++){//遍历背包
for(int j = 0; j < i; j++){//遍历物品
string word = s.substr(j, i-j); //substr(起始位置,截取的个数)
if(wordSet.find(word) != wordSet.end() && dp[j]){
dp[i] = true;
}
}
}
return dp[s.size()];
}
//一刷动规
/*
bool wordBreak(string s, vector<string>& wordDict) {
unordered_set<string> wordSet(wordDict.begin(), wordDict.end()); //将词典中的词放入一个set中
vector<bool> dp(s.size()+1, false); //dp数组,dp[i]表示:
//字符串长度为i的话,dp[i]为true,表示可以拆分为一个或多个在字典张出现的单词
dp[0] = true;
for(int i = 1; i <= s.size(); i++){ //遍历背包
for(int j = 0; j < i; j++){ //遍历物品
string word = s.substr(j,i-j);//substr(起始位置,截取的个数)
if(wordSet.find(word)!=wordSet.end() && dp[j]){
dp[i] = true;
}
}
}
return dp[s.size()];
}
*/
};
关于多重背包,你该了解这些!
这个大家可以参考卡尔的说明。
链接为:https://programmercarl.com/背包问题理论基础多重背包.html#多重背包
有N种物品和一个容量为V 的背包。第i种物品最多有Mi件可用,每件耗费的空间是Ci ,价值是Wi 。求解将哪些物品装入背包可使这些物品的耗费的空间 总和不超过背包容量,且价值总和最大。
多重背包和01背包是非常像的, 为什么和01背包像呢?
每件物品最多有Mi件可用,把Mi件摊开,其实就是一个01背包问题了。
例如:
背包最大重量为10。
物品为:
重量 | 价值 | 数量 | |
---|---|---|---|
物品0 | 1 | 15 | 2 |
物品1 | 3 | 20 | 3 |
物品2 | 4 | 30 | 2 |
问背包能背的物品最大价值是多少?
和如下情况有区别么?
重量 | 价值 | 数量 | |
---|---|---|---|
物品0 | 1 | 15 | 1 |
物品0 | 1 | 15 | 1 |
物品1 | 3 | 20 | 1 |
物品1 | 3 | 20 | 1 |
物品1 | 3 | 20 | 1 |
物品2 | 4 | 30 | 1 |
物品2 | 4 | 30 | 1 |
毫无区别,这就转成了一个01背包问题了,且每个物品只用一次。
背包问题总结篇!
背包问题的总结,也是参考下面的链接吧。
https://programmercarl.com/背包总结篇.html#背包递推公式
总结
再重复一下动规解法五部曲:
- 确定dp数组(dp table)以及下标的含义
- 确定递推公式
- dp数组如何初始化
- 确定遍历顺序
- 举例推导dp数组