对于大厂面试而言,01背包主要考察两种背包:
1、01背包
n种物品,每种物品只有一个
2、 完全背包
n种物品,每种物品无限个
3、 多重背包
n种物品,每种物品个数各不相同
LeetCode上面没有纯粹的01背包问题,主要是背包问题的应用
下面给出一个简单的01背包问题的例子
重量 | 价值 | |
物品0 | 1 | 15 |
物品1 | 3 | 20 |
物品2 | 4 | 30 |
其中,背包最大重量为4,可装满的最大价值为?
(1)考虑暴力解法
每个物品两个状态:取or不取
因此我们可以用 回溯算法 来枚举所有情况;时间复杂度O(2^n)【这个就涉及到学习回溯算法咯】
(2)二维dp数组解法
动态规划五部曲:
1、明确dp数组含义
dp[i][j] :0 ~ i 之间的物品任取,放进容量为 j 的背包里的最大价值
2、确定递推公式
思考:dp[i][j] 可由哪些状态推导而来?此题中,有两种状态:放物品i or 不放物品i