要完成此动态编程问题,我该怎么做?

时间:2019-06-01 18:58:18

标签: python-3.x

我有一个作业告诉我: 小贩必须决定下一次旅行要携带什么产品。不幸的是,您有一个可以携带的重量限制,并且牢记这一点,您必须选择最大重量的产品的最佳组合,这将使您获得最大的收益。

您将收到卖方可以携带的重量限制,然后是他可以选择的产品列表(假设您可以随意使用每种产品的库存不限)。将为每种产品列出其名称,价值和重量。如果您出售所有选择携带的产品,则应打印可以获取的最大收入,然后按字母顺序排列获取该收入(包括复制品,如果适用)的产品清单。如果有两种产品具有相同的获利能力/权重,则应优先考虑条目列表中最先出现的产品。

我正在从文件中读取输入。

  

输入
  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()

我不知道选择了哪些项目。 你能帮我吗?

1 个答案:

答案 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)