有N个物品,每个物品的重量是wi ,每个物品的价值是vi 。 求解当背包容量为W时,能获得的最大价值,并输出获得最大价值时每种物品是否在背包内 数据范围 0 < n <= 30 重量、价值、背包容量均为正整数
时间: 2024-05-15 14:13:29 浏览: 61
给定n种物品和一个背包
5星 · 资源好评率100%
这是一个经典的背包问题,可以使用动态规划来解决。
定义一个二维数组dp,其中dp[i][j]表示前i个物品放入容量为j的背包中可以获得的最大价值。
状态转移方程为:
- 如果第i个物品重量大于当前背包容量j,则不能放入背包中,dp[i][j] = dp[i-1][j];
- 如果第i个物品重量小于等于当前背包容量j,则可以选择放或者不放,取两者中的最大值,即dp[i][j] = max(dp[i-1][j], dp[i-1][j-wi] + vi)。
最后,dp[n][W]就是能获得的最大价值。同时,我们可以借助dp数组来输出获得最大价值时每种物品是否在背包内。
具体实现如下:
```python
n = int(input())
w = list(map(int, input().split()))
v = list(map(int, input().split()))
W = int(input())
# 初始化dp数组
dp = [[0] * (W+1) for _ in range(n+1)]
# 动态规划
for i in range(1, n+1):
for j in range(1, W+1):
if w[i-1] > j:
dp[i][j] = dp[i-1][j]
else:
dp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i-1]] + v[i-1])
# 输出最大价值
print(dp[n][W])
# 输出每种物品是否在背包内
x = n
y = W
while x > 0 and y > 0:
if dp[x][y] == dp[x-1][y]:
print("第{}个物品不在背包中".format(x))
else:
print("第{}个物品在背包中".format(x))
y -= w[x-1]
x -= 1
```
阅读全文