编程代码入门教学

泳宏 阅读:831 2024-04-21 00:26:15 评论:0

解题:使用动态规划解决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背包问题的动态规划解法,并返回了最大价值以及选择的物品索引。

搜索
排行榜
最近发表
关注我们

扫一扫关注我们,了解最新精彩内容