算法刷题打卡040 | 动态规划8

01背包和完全背包掌握之后,还有一个多重背包的问题。多重背包,我理解为介于01背包和完全背包之间,每个物品既不是只有1个,也不是有无限个可用,而是有固定数量,使得解题时要多考虑一个维度。因此一种解题方法是在01背包中再加一层物品数量的遍历,或者是将同一种物品的多个拆分,将问题转化为有相同物品的01背包。接下来就是一些背包问题应用和复习巩固。

LeetCode 139 单词拆分

题目链接:139. 单词拆分 - 力扣(Leetcode)

 拆分问题可以类比分割回文串,用回溯去搜索分割的位置,判断是否能分割的条件变为分割的子串是否在字典里。应用背包问题的话,这就是个完全背包,字典中的每个单词可以被重复使用。dp数组的值可以是True或False,含义是当前子串(s[0:i],左闭右闭)是否可以被拆分为单词的拼接。状态递推的过程中,对于j

自己实现的时候在遍历物品的时候犯了难,想着遍历的维度是物品,那就是字典中单词的个数,但这和递推过程相悖。看了讲解才知道物品这一维应该根据当前背包容量确定:

class Solution {
public:
    bool wordBreak(string s, vector& wordDict) {
        int bagSize = s.size();
        int n = wordDict.size();
        // 预处理wordDict,用哈希表存储,便于快速查找
        unordered_set words(wordDict.begin(), wordDict.end());

        vector dp(bagSize+1, false);
        dp[0] = true;
        for(int i=0; i<=bagSize; i++){
            for(int j=0; j

背包问题小结

背包相关题目算是刷完了,01背包和完全背包也算是基本掌握了,但关于遍历顺序的部分还是有些困惑,需要多看多做题去理解。此外同样需要一些透过现象看本质的能力,才能将问题抽象为背包问题求解。

你可能感兴趣的:(刷题,算法,动态规划,数据结构)