Day49~139.单词拆分、多重背包

67 阅读2分钟

摘要

本文主要介绍了LeetCode中动态规划的139.单词拆分题目、多重背包理论基础以及背包问题的总结。

1、139.单词拆分

1.1 思路

1、递推公式的理解?

对每个 j,其中 j < i,检查从 j 到 i 的子串是否是字典中的单词,并且 dp[j] 为True,表示前半部分可以被拆分成单词,那么将 dp[i] 设置为True

  • 动规五部曲

    • dp 数组以及下标的含义

      • dp[j] 表示以 j 结尾的下标的字符串 s 是否可以利用字典中出现的单词拼接出
    • 递推公式

      • 如果确定dp[j] 是true,且 [j, i] 这个区间的子串出现在字典里,那么dp[i]一定是true
      • 所以递推公式是 if([j, i] 这个区间的子串出现在字典里 && dp[j]是true) 那么 dp[i] = true
    • dp 数组如何初始化

      • dp[0] == ture;其他默认初始化都为 false,
    • dp 数组遍历顺序

      • 求排列数,先遍历背包,后遍历物品
    • 举例推导dp数组

      • 139.单词拆分

1.2 代码

    public boolean wordBreak(String s, List<String> wordDict) {
        HashSet<String> set = new HashSet<>(wordDict);
        int len = s.length();
        boolean[] dp = new boolean[len+1];
        dp[0] = true;
​
        for(int i=1; i<=len; i++) {
            for(int j=0; j<i; j++) {
                if(wordDict.contains(s.substring(j, i)) && dp[j] == true) {
                    dp[i] = true;
                }
            }
        }
        return dp[len];
    }

2、多重背包 *

有N种物品和一个容量为V 的背包。第i种物品最多有Mi件可用,每件耗费的空间是Ci ,价值是Wi 。求解将哪些物品装入背包可使这些物品的耗费的空间 总和不超过背包容量,且价值总和最大。

每件物品最多有Mi件可用,把Mi件摊开,其实就是一个01背包问题了。

重量价值数量
物品01152
物品13203
物品24302

3、背包问题总结

参考资料

代码随想录-139.单词拆分

代码随想录-多重背包

代码随想录-背包问题总结