有 N件物品和一个容量是 V的背包。每件物品只能使用一次。
第 i 件物品的体积是 vi,价值是 wi。
求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。
输出最大价值。
输入格式
第一行两个整数,N,V,用空格隔开,分别表示物品数量和背包容积。
接下来有 N 行,每行两个整数 vi,wi,用空格隔开,分别表示第 i件物品的体积和价值。
输出格式
输出一个整数,表示最大价值。
代码:
def knapsack(N, V, volumes, values):
dp = [0] * (V + 1)
for i in range(N):
for j in range(V, volumes[i] - 1, -1):
dp[j] = max(dp[j], dp[j - volumes[i]] + values[i])
return dp[V]
# 读取输入
N, V = map(int, input().split())
volumes, values = [], []
for _ in range(N):
v, w = map(int, input().split())
volumes.append(v)
values.append(w)
# 输出结果
result = knapsack(N, V, volumes, values)
print(result)
-
knapsack 函数:
knapsack
函数采用四个参数:N
表示物品数量,V
表示背包容量,volumes
表示每个物品的体积数组,values
表示每个物品的价值数组。- 函数使用一维数组
dp
来保存在不同背包容量下的最大总价值。
-
动态规划主循环:
- 通过两个嵌套循环遍历所有物品和所有可能的背包容量。
for i in range(N):
遍历每个物品。for j in range(V, volumes[i] - 1, -1):
从背包容量V
到当前物品的体积volumes[i]
,逆向遍历,更新dp[j]
。
-
状态转移方程:
dp[j] = max(dp[j], dp[j - volumes[i]] + values[i])
,表示在当前容量j
下,选择放入物品i
或不放入,选择最大价值。
-
返回结果:
- 最终结果保存在
dp[V]
中,表示背包容量为V
时的最大总价值。
- 最终结果保存在
-
读取输入:
- 从输入中读取物品数量
N
和背包容量V
。 - 循环读取每个物品的体积和价值,将它们分别保存在
volumes
和values
数组中。
- 从输入中读取物品数量
-
输出结果:
- 调用
knapsack
函数计算最大价值,并将结果输出。
- 调用
示例输入:
3 5
2 3
1 2
3 4
示例输出:
7