描述:
指的是 n个物品,每个只有1件,放入一个容量固定的背包,在不超过背包容量时使得放入物品的价值最大
问题:
有如下物品:
物品 | 重量 | 价值 |
物品1 | 1 | 15 |
物品2 | 3 | 20 |
物品3 | 4 | 30 |
将物品放入一个容量为 4的背包,求放入物品的最大价值
状态定义:
定义一个二维数组 dp,其中dp[i][j]表示 将下标为 0-i之间的物品放入容量为j的背包的最大价值。
递推公式:
不放入 物品i的最大价值: dp[i-1][j]
放入 物品 i 的最大价值: dp[i-1][j-weight[i])+value(i)
dp[i-1][j-weight[i]]+value(i) 理解起来就是 总的容量减物品i的容量之后放入其他物品的最大价值+物品i的价值
dp[i][j] = Max(不放入物品i的最大价值,放入物品i的最大价值)
状态初始化:
物品/容量 | 0 | 1 | 2 | 3 | 4 |
物品1 | 0 | 15 | 15 | 15 | 15 |
物品2 | 0 | dp[i][j] | |||
物品3 | 0 |
dp[i][j]是由上图中的颜色区域推导出来,所以需要将边界值先进行初始化。
代码:
l = [(1, 15), (3, 20), (4, 30)]
# 初始化dp
dp = [[0, 15, 15, 15, 15], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]
for i in range(1, len(l)):
for j in range(1, len(dp[0])):
weight = j - l[i][0]
if weight >= 0:
dp[i][j] = max([dp[i - 1][j], dp[i - 1][weight] + l[i][1]])
else:
dp[i][j] = 0
print(dp)