文章目录
- 一、139.单词拆分
- 二、关于多重背包,你该了解这些!
- 三、背包问题总结篇!
- 总结
一、139.单词拆分
public boolean wordBreak(String s, List<String> wordDict) {
//完全背包问题,因为可以重复,背包正序排列
//排列问题,先遍历背包,再遍历物品
boolean[] dp = new boolean[s.length()+1];//容量为j的背包,是否可以拼接出来
Arrays.fill(dp,false);
dp[0] = true;
for(int j=0;j<=s.length();j++){//遍历背包
for(int i=0;i<wordDict.size();i++){//遍历物品
if(j>= wordDict.get(i).length()&&dp[j - wordDict.get(i).length()]&& s.substring(j - wordDict.get(i).length(), j).equals(wordDict.get(i))){
dp[j]=true;
}
// if (j >= wordDict.get(i).length() && dp[j - wordDict.get(i).length()] && s.substring(j - wordDict.get(i).length(), j).equals(wordDict.get(i))) {
// dp[j] = true;
// // break;
// }
}
}
return dp[s.length()];
}
11分钟
二、关于多重背包,你该了解这些!
-
自己看到题目的第一想法
-
看完题解之后的想法
-
自己实现过程中遇到的问题总结
46分钟
三、背包问题总结篇!
-
问能否能装满背包(或者最多装多少):dp[j] = max(dp[j], dp[j - nums[i]] + nums[i]); ,对应题目如下:
动态规划:416.分割等和子集(opens new window)
动态规划:1049.最后一块石头的重量 II(opens new window) -
问装满背包有几种方法:dp[j] += dp[j - nums[i]] ,对应题目如下:
动态规划:494.目标和(opens new window)
动态规划:518. 零钱兑换 II(opens new window)
动态规划:377.组合总和Ⅳ(opens new window)
动态规划:70. 爬楼梯进阶版(完全背包)(opens new window) -
问背包装满最大价值:dp[j] = max(dp[j], dp[j - weight[i]] + value[i]); ,对应题目如下:
动态规划:474.一和零(opens new window) -
问装满背包所有物品的最小个数:dp[j] = min(dp[j - coins[i]] + 1, dp[j]); ,对应题目如下:
动态规划:322.零钱兑换(opens new window)
动态规划:279.完全平方数 -
如果求组合数就是外层for循环遍历物品,内层for遍历背包。
如果求排列数就是外层for遍历背包,内层for循环遍历物品。