-
定义状态:
- 使用一个二维数组
dp[i][j],其中i表示前i个物品,j表示当前背包的容量。dp[i][j]表示在前i个物品中选择物品放入容量为j的背包中所能获得的最大价值。
- 使用一个二维数组
-
状态转移方程:
-
对于每个物品
i,我们有两种选择:- 不放入背包:此时
dp[i][j] = dp[i-1][j],即不选择当前物品,背包的价值与前i-1个物品相同。 - 放入背包:如果当前背包容量
j大于等于物品i的重量weights[i-1],则可以选择放入物品i,此时dp[i][j] = dp[i-1][j - weights[i-1]] + values[i-1],即选择当前物品,背包的价值为前i-1个物品在容量为j - weights[i-1]时的最大价值加上当前物品的价值。
- 不放入背包:此时
-
最终的状态转移方程为:
plaintext
dp[i][j] = max(dp[i-1][j], dp[i-1][j - weights[i-1]] + values[i-1])
-
-
初始化:
dp[0][j]表示没有物品可选时,背包的最大价值为0。dp[i][0]表示背包容量为0时,最大价值为0。
-
最终结果:
- 最终答案为
dp[n][m],即在前n个物品中选择物品放入容量为m的背包中所能获得的最大价值。
- 最终答案为