一、实例分析
假设背包容量为 5,有 3 个物品,其重量和价值分别为:物品 1(重量 2,价值 3),物品 2(重量 3,价值 4),物品 3(重量 4,价值 5)。
物品(i)\背包容量(w) | 0 | 1 | 2 | 3 | 4 | 5 |
0 | 0 | 0 | 0 | 0 | 0 | 0 |
1 | 0 | 0 | 3 | 3 | 3 | 3 |
2 | 0 | 0 | 3 | 4 | 4 | 7 |
3 | 0 | 0 | 3 | 4 | 5 | 7 |
表格中的行代表物品(0 代表没有物品),列代表背包容量。每个单元格的值 dp[i][w]是第i种物品放入背包后的价值。
二、状态转移方程:
qd[i][w]=max(qd[i-1][w],qd[i-1][w-weights]+value)
三、代码
def knapSack(capacity, weights, values):
n = len(weights)
dp = [[0 for _ in range(capacity + 1)] for _ in range(n + 1)]
for i in range(1, n + 1):
for w in range(1, capacity + 1):
if weights[i - 1] <= w:
dp[i][w] = max(dp[i - 1][w], dp[i - 1][w - weights[i - 1]] + values[i - 1])
else:
dp[i][w] = dp[i - 1][w]
return dp[n][capacity]
# 测试示例
capacity = 5
weights = [2, 3, 4]
values = [3, 4, 5]
print(knapSack(capacity, weights, values))