题目描述
给定n种物品和一个背包,物品i的重量是Wi,其价值为Vi,背包的容量为C。如何选择装入背包的物品,可以使得装入背包中物品的总价值最大?
输入
每组输入包括三行,
第一行包括物品个数n,以及背包容量C。
第二、三行包括两个一维数组,分别为每一种物品的价值和重量。
输出
输出包括两行,第一行为背包的最大总价值,第二行为所选取的物品。
例如:最大总价值=15,物品选取策略为11001。数据保证答案唯一。
样例输入 Copy
5 10 6 3 5 4 6 2 2 6 5 4
样例输出 Copy
15 11001
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)]
select = [[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:
if dp[i - 1][j] < dp[i - 1][j - w[i]] + v[i]:
dp[i][j] = dp[i - 1][j - w[i]] + v[i]
select[i][j] = 1 # 记录选择物品 i
else:
dp[i][j] = dp[i - 1][j]
else:
dp[i][j] = dp[i - 1][j]
print(dp[n][c])
# 根据选择策略反向推导出所选择的物品
items_selected = ""
j = c
for i in range(n, 0, -1):
if select[i][j] == 1:
items_selected = "1" + items_selected
j -= w[i]
else:
items_selected = "0" + items_selected
print(items_selected)
except EOFError:
break