摘要
本文主要介绍了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数组
-
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背包问题了。
| 重量 | 价值 | 数量 | |
|---|---|---|---|
| 物品0 | 1 | 15 | 2 |
| 物品1 | 3 | 20 | 3 |
| 物品2 | 4 | 30 | 2 |