背包小总结 (01背包、完全背包)

背包问题最重要的就是两点:递推公式和遍历顺序
背包问题面试常考的就是 01背包和完全背包。
其中 01背包中物品只能选一次,完全背包中物品可以无限次选取
背包类型主要有两种题型:
- 求使背包装尽可能装满能获取的最大/最小价值或装满背包的最大/最小物品个数
递推公式
最大/最小价值:dp[j] = max or min(dp[j], dp[j - weight[i]] + value[i]);
最大/最小物品个数:dp[j] = Math.max or min(dp[j], dp[j - coins[i]] + 1);
初始化
最少:dp[0]=0; 其他的初始化为正无穷最多:全初始化为0就行(前提是coins中元素全为正数;否则,需要把负元素在dp中对应的位置初
始化为负无穷)
- 求使背包装满的方案数(主要有两种情况组合数(顺序无关)和排列数(顺序有关))
递推公式:都是 dp[j] += dp[j - nums[i]];
但是二者内外层的遍历顺序不同:
组合数:外层for循环遍历物品,内层for遍历背包。
排列数:外层for遍历背包,内层for循环遍历物品。
背包的遍历顺序:
- 01 背包
01 背包中二维 dp 数组的两个 for 遍历的内外循序是可以颠倒的
这里内外层都是从小到大遍历 01 背包中一维 dp 数组的两个 for 循环内外循序一定是先遍历物品,再遍历背包容量
注意:内层循环(背包容量)必须倒序遍历,保证每个物品只取一次。
- 完全背包
在完全背包中,对于一维 dp 数组来说,其实两个 for 循环嵌套顺序同样无所谓(仅限于纯完全背包问题!)

全站分卷索引 · 42 卷
- 1代码随想录知识星球精华(最强八股文)第五版(算法篇)
- 2找出所有子集的异或总和再求和
- 3哈希表
- 4哈希冲突
- 5红黑树与AVL树
- 6平衡二叉树(AVL树)
- 7将有序数组转换为二叉搜索树
- 83. 分割(组合问题)
- 9方法论
- 10509. 斐波那契数
- 1162. 不同路径
- 1296. 不同的二叉搜索树
- 13322. 零钱兑换
- 14爬楼梯
- 15背包小总结 (01背包、完全背包)
- 16子序列问题
- 17674. 最长连续递增序列
- 18115. 不同的子序列
- 19总结
- 20技巧总结
- 21时间序列模型
- 22区间DP模型
- 23664. 奇怪的打印机
- 24编辑距离
- 25回文串
- 26DP递推公式总结
- 27排序算法
- 28其他算法
- 294. 分别用递归和非递归方式实现二叉树先序、中序和后序遍历
- 302. TOP N问题
- 313. 分布式的TOP N问题
- 322. Astar数据结构 + 公式
- 334. 代码实现
- 345. 总体代码
- 35堆排序
- 36单源最短路
- 37思维导图
- 38链表
- 39回溯
- 40贪心
- 41动态规划
- 42排序