目录
139.单词拆分
多重背包
背包问题总结
01背包
完全背包
多重背包
139.单词拆分
题目链接:139. 单词拆分
不要求字典中的单词全部使用,但是要求拆分的单词拆分成的每一个子串都是字典中的单词。
(1)dp[ i ] 表示前 i 个字符组成的字符串可以被字典中的单词拆分;
(2)dp[ i ] = dp[ j ] && check(str, i - j + 1);
(3)均初始化为false;
(4)强调子串顺序,外层遍历背包,内层遍历物品;
class Solution {
public:bool wordBreak(string s, vector<string>& wordDict) {unordered_set<string> wordSet(wordDict.begin(), wordDict.end());vector<bool> dp(s.size() + 1, false);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);if(dp[j] && (wordSet.find(word) != wordSet.end()))dp[i] = true;}}return dp[s.size()];}
};
dp数组的更新并没有像我五部曲那样写,因为并不是每次dp[ i ] 都需要更新。
多重背包
多重背包中,将 物品的数量 转化为 数量个相同的物品,转化成 01背包问题;
C++ 实现中时在循环中遍历数量。
背包问题总结
01背包
物品数量为 1,循环顺序:外层遍历物品、内层从大到小遍历背包容量。
完全背包
物品数量无限;循环顺序:(1)组合问题:外层遍历物品、内层从小到大遍历背包容量;(2)排列问题:外层遍历背包容量,内层遍历物品。
多重背包
转化为 01背包。