编程代码入门教学
解题:使用动态规划解决01背包问题
问题描述:
给定一组物品,每个物品都有自己的重量和价值,在限定的总重量下,选择一些物品装入背包,使得装入的物品总价值最大。
问题分析:
这是经典的动态规划问题。我们可以使用一个二维数组 `dp[i][j]` 来表示前 `i` 个物品,在背包容量为 `j` 的情况下可以获得的最大价值。状态转移方程如下:
```
dp[i][j] = max(dp[i1][j], dp[i1][j weights[i]] values[i])
```
其中,`dp[i1][j]` 表示不选择第 `i` 个物品时的最大价值,`dp[i1][j weights[i]] values[i]` 表示选择第 `i` 个物品时的最大价值。
Python代码实现:
```python
def knapsack(weights, values, capacity):
n = len(weights)
初始化dp数组
dp = [[0] * (capacity 1) for _ in range(n 1)]
动态规划过程
for i in range(1, n 1):
for j in range(1, capacity 1):
if j >= weights[i 1]:
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]
回溯找到选择的物品
selected_items = []
i, j = n, capacity
while i > 0 and j > 0:
if dp[i][j] != dp[i 1][j]:
selected_items.append(i 1)
j = weights[i 1]
i = 1
return dp[n][capacity], selected_items
示例
weights = [2, 3, 4, 5]
values = [3, 4, 5, 6]
capacity = 8
max_value, selected_items = knapsack(weights, values, capacity)
print("最大价值:", max_value)
print("选择的物品索引:", selected_items)
```
以上代码实现了01背包问题的动态规划解法,并返回了最大价值以及选择的物品索引。