给定n个重量为{w1, w2, … ,wn}、价值为{v1, v2, … ,vn}的物品和一个容量为C的背包,求这些物品中的一个最有价值的子集,且要能够装到背包中。 输入格式: 有多组数据,每组数据第一行表示物品的数量n(0<n<=20)和背包容量C(0<C<=300);后面有n行,表示n个物品的信息,每个物品信息占一行,包括物品的重量w和物品的价值v,w和v之间用空格隔开。(注:重量和价值为1到100之间的整数,包括1和100) 输出格式: 每组输出占一行,若背包有物品,输出其价值;若背包为空则输出0。
时间: 2023-10-25 17:21:29 浏览: 122
这是一个经典的背包问题,可以使用动态规划来解决。设dp[i][j]表示前i个物品放入容量为j的背包中所能获得的最大价值。则有状态转移方程:
dp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i]] + v[i])
其中,dp[i-1][j]表示不放第i个物品,dp[i-1][j-w[i]] + v[i]表示放第i个物品。
最终的答案即为dp[n][C]。
下面是一个Python实现:
```python
while True:
try:
n, C = map(int, input().split())
w, v = [0], [0]
for i in range(n):
wi, vi = map(int, input().split())
w.append(wi)
v.append(vi)
dp = [[0] * (C+1) for _ in range(n+1)]
for i in range(1, n+1):
for j in range(1, C+1):
if j < w[i]:
dp[i][j] = dp[i-1][j]
else:
dp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i]] + v[i])
print(dp[n][C])
except:
break
```
注意要使用try-except,因为可能会有多组数据。
阅读全文