我有一个作业告诉我: 小贩必须决定下一次旅行要携带什么产品。不幸的是,您有一个可以携带的重量限制,并且牢记这一点,您必须选择最大重量的产品的最佳组合,这将使您获得最大的收益。
您将收到卖方可以携带的重量限制,然后是他可以选择的产品列表(假设您可以随意使用每种产品的库存不限)。将为每种产品列出其名称,价值和重量。如果您出售所有选择携带的产品,则应打印可以获取的最大收入,然后按字母顺序排列获取该收入(包括复制品,如果适用)的产品清单。如果有两种产品具有相同的获利能力/权重,则应优先考虑条目列表中最先出现的产品。
我正在从文件中读取输入。
输入:
14
圣经20 2
微波炉150 10
电视200 15
烤面包机40 3输出:
190
圣经
圣经
微波
我已将此代码设置为达到小贩可以随身携带的最大值:
import sys
def knapsack(list_values,list_weight,limit_weight,n):
matrix = [[0 for x in range(limit_weight+1)] for y in range (n+1)]
res = []
for i in range(n+1):
for j in range(limit_weight+1):
if i == 0 or j == 0:
matrix[i][j] = 0
elif list_weight[i-1]<= j:
matrix[i][j] = max(list_values[i-1] + matrix[i-1][j-list_weight[i-1]], matrix[i-1][j])
else:
matrix[i][j] = matrix[i-1][j]
return matrix[n][limit_weight], matrix
def main():
txt = sys.stdin.readlines()
limit_weight = int(txt[0])
list_names = []
list_values = []
list_weight = []
picked = []
for lines in txt[1:]:
lines = lines.split()
list_weight.append(int(lines[2]))
list_values.append(int(lines[1]))
list_names.append(lines[0])
result, matrix = knapsack(list_values,list_weight, limit_weight, len(list_values))
print(result)
main()
我不知道选择了哪些项目。 你能帮我吗?
答案 0 :(得分:0)
import sys
def knapsack(list_names, list_values,list_weight,limit_weight,n):
matrix = [[0 for x in range(limit_weight+1)] for y in range (n+1)]
res = []
for i in range(n+1):
for j in range(limit_weight+1):
if i == 0 or j == 0:
matrix[i][j] = 0
elif list_weight[i-1]<= j:
matrix[i][j] = max(list_values[i-1] + matrix[i-1][j-list_weight[i-1]], matrix[i-1][j])
else:
matrix[i][j] = matrix[i-1][j]
res.append(matrix[i][j])
weights = [i[-1] for i in matrix]
values = [j-i for i, j in zip(weights, weights[1:])]
items = []
for i in zip(list_names, list_values):
for v in values:
if i[1] == v:
items.append(i[0])
return matrix[n][limit_weight], sorted(items), matrix
def main():
txt = sys.stdin.readlines()
limit_weight = int(txt[0])
list_names = []
list_values = []
list_weight = []
picked = []
for lines in txt[1:]:
lines = lines.split()
list_weight.append(int(lines[2]))
list_values.append(int(lines[1]))
list_names.append(lines[0])
result, items, matrix = knapsack(list_names, list_values,list_weight, limit_weight, len(list_values))
print(items)