用python和动态规划写0-1背包问题
时间: 2023-10-22 10:20:10 浏览: 89
好的,下面是Python代码实现:
```python
def knapsack_01(weights, values, capacity):
n = len(weights)
# 创建二维数组并初始化为0
dp = [[0] * (capacity + 1) for _ in range(n + 1)]
# 填充dp数组
for i in range(1, n + 1):
for j in range(1, capacity + 1):
if weights[i-1] <= j:
dp[i][j] = max(dp[i-1][j], dp[i-1][j-weights[i-1]] + values[i-1])
else:
dp[i][j] = dp[i-1][j]
# 返回最优解
return dp[n][capacity]
```
其中,`weights`和`values`分别是物品的重量和价值的列表,`capacity`是背包的容量。函数返回最大价值。
具体实现过程如下:
1. 创建一个二维数组`dp`,其中`dp[i][j]`表示前`i`个物品放入容量为`j`的背包中所能获得的最大价值。
2. 初始化第一行和第一列为0,因为没有物品或背包容量为0时,最大价值为0。
3. 对于每个物品,遍历所有可能的背包容量。如果该物品的重量小于等于当前背包容量,则可以选择放入或不放入背包中,取两者中的最大值;否则,只能选择不放入背包中。
4. 遍历完所有物品后,`dp[n][capacity]`即为最大价值,其中`n`为物品数。
这个算法的时间复杂度为$O(nW)$,其中$n$为物品数,$W$为背包容量。
阅读全文