Day46 | 139.单词拆分, 关于多重背包,你该了解这些!, 背包问题总结篇

文章探讨了LeetCode中的单词拆分问题,将其与完全背包问题相联系,强调动态规划和unordered_set在解决这类问题中的应用。同时介绍了如何将多重背包问题转化为01背包问题,提供了问题解决的思路和方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值