0-1背包问题
题目描述
给定n种物品和一个背包,物品i的重量是Wi,其价值为Vi,背包的容量为C。如何选择装入背包的物品,可以使得装入背包中物品的总价值最大?求最大总价值。
输入
每组输入包括三行,
第一行包括物品个数n,以及背包容量C。
第二、三行包括两个一维数组,分别为每一种物品的价值和重量。
输出
输出为一行,即输出最大总价值。
样例输入 Copy
5 10 6 3 5 4 6 2 2 6 5 4
样例输出 Copy
15
#输入
n, c = list(map(int, input().split()))
v = list(map(int, input().split()))
w = list(map(int, input().split()))
#初始化dp表 dp = [[0 for i in range(c + 1)] for i in range(n + 1)] #在最前面增加一列,最上面增加一行,防止数组越界,让索引从1开始 w.insert(0, 0) v.insert(0, 0)
#初始DP表(增加了一列,一行后)
***这里采取的是逐个物体考虑策略,如果有一个物体,怎么让价值最大,如果有两个、三个,怎么让价值最大。
#dp表的绘制 for i in range(1, n + 1): for j in range(1, c + 1): if w[i] <= j: dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+v[i]) else: dp[i][j]=dp[i-1][j]#不放当前的物体的最大价值
###DP表的更新:
1.增加物品1:
2.增加物品2:
3.增加物品3:
4.增加物品4:
5.增加物品5:
#输出结果
print(dp[n][c])
#完整代码:
while True:
try:
n, c = list(map(int, input().split()))
v = list(map(int, input().split()))
w = list(map(int, input().split()))
dp = [[0 for i in range(c + 1)] for i in range(n + 1)]
w.insert(0, 0)
v.insert(0, 0)
for i in range(1, n + 1):
for j in range(1, c + 1):
if w[i] <= j:
dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+v[i])
else:
dp[i][j]=dp[i-1][j]
print(dp[n][c])
except EOFError:
break