01背包问题代码实现
01背包问题
问题描述: 给定一组物品,每个物品有一个重量和一个价值,另有一个背包,它的容量为限定的重量。目标是找出一个物品的子集,使得这些物品的总重量不超过背包的容量,并且它们的总价值最大。
动态规划解法
状态定义:
- 用
dp[i][w]
表示前i
个物品中可以放入一个容量为w
的背包的最大价值。
- 用
状态转移方程:
- 如果不选择第
i
个物品:dp[i][w] = dp[i-1][w]
- 如果选择第
i
个物品:dp[i][w] = dp[i-1][w-weight[i-1]] + value[i-1]
- 综合两种情况:
dp[i][w] = max(dp[i-1][w], dp[i-1][w-weight[i-1]] + value[i-1])
- 如果不选择第
初始化:
- 当没有物品或容量为0时,
dp[0][w] = 0
和dp[i][0] = 0
- 当没有物品或容量为0时,
结果:
- 最终结果在
dp[n][W]
,其中n
是物品的数量,W
是背包的容量。
- 最终结果在
C实现
1 |
|
C++实现
1 |
|
Python实现
1 | def knapsack(W, wt, val): |
解释
状态定义:
dp[i][w]
表示前i
个物品中可以放入容量为w
的背包的最大价值。
状态转移方程:
- 如果不选择第
i
个物品:dp[i][w] = dp[i-1][w]
- 如果选择第
i
个物品:dp[i][w] = dp[i-1][w-weight[i-1]] + value[i-1]
- 综合两种情况:
dp[i][w] = max(dp[i-1][w], dp[i-1][w-weight[i-1]] + value[i-1])
- 如果不选择第
初始化:
dp[0][w] = 0
和dp[i][0] = 0
表示当没有物品或容量为0时,最大价值为0。
计算结果:
- 通过迭代填充
dp
数组,最终结果存储在dp[n][W]
中,其中n
是物品的数量,W
是背包的容量。
- 通过迭代填充