代码随想录算法训练营第四十六天 | 139.单词拆分,多重背包,背包问题总结

目录

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& wordDict) {
        unordered_set wordSet(wordDict.begin(), wordDict.end());
        vector 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背包。

你可能感兴趣的:(算法,动态规划,leetcode,c++)