动态规划方法-背包拼图



我正在尝试用Python 3.x的动态编程(DP)方法解决背包问题。我的助教向我们指出了这段代码,让我们领先一步。我尝试实现它,如下所示:

def take_input(infile):
    f_open = open(infile, 'r')
    lines = []
    for line in f_open:
        lines.append(line.strip())
    f_open.close()
    return lines
def create_list(jewel_lines):
    #turns the jewels into a list of lists
    jewels_list = []
    for x in jewel_lines:
        weight = x.split()[0]
        value = x.split()[1]
        jewels_list.append((int(value), int(weight)))
    jewels_list = sorted(jewels_list, key = lambda x : (-x[0], x[1]))
    return jewels_list
def dynamic_grab(items, max_weight):
    table = [[0 for weight in range(max_weight+1)] for j in range(len(items)+1)]
    for j in range(1,len(items)+1):
        val= items[j-1][0]
        wt= items[j-1][1]
        for weight in range(1, max_weight+1):
            if wt > weight:
                table[j][weight] = table[j-1][weight]
            else:
                table[j][weight] = max(table[j-1][weight],table[j-1][weight-wt] + val)
    result = []
    weight = max_weight
    for j in range(len(items),0,-1):
        was_added = table[j][weight] != table[j-1][weight]
        if was_added:
            val = items[j-1][0]
            wt = items[j-1][1]
            result.append(items[j-1])
            weight -= wt
    return result
def totalvalue(comb):
    #total of a combo of items
    totwt = totval = 0
    for val, wt in comb:
        totwt += wt
        totval += val
    return (totval, -totwt) if totwt <= max_weight else (0,0)
#required setup of variables    
infile = "JT_test1.txt"
given_input = take_input(infile)
max_weight = int(given_input[0])
given_input.pop(0)
jewels_list = create_list(given_input)
#test lines
print(jewels_list)
print(greedy_grab(jewels_list, max_weight))
bagged = dynamic_grab(jewels_list, max_weight)
print(totalvalue(bagged))

示例案例如下。它的格式为 行 [0] = bag_max,行 [1:] 的形式(权重,值):

575
125 3000
50 100
500 6000
25 30

我对这段代码的逻辑感到困惑,因为它向我返回了一个元组,我不确定输出元组代表什么。我已经看了一段时间了,只是不明白代码指向我什么。任何帮助将不胜感激。

我假设你指的是由 totalvalue 返回并包含在 createlist 返回的列表中的元组。 这些元组都包含两个整数。 这两个数字中的第一个是宝石的价值,第二个是宝石的重量。

按 totalvalue 返回的最终元组表示可以从输入宝石列表中选择的宝石的最大可能值,而不会超过最大权重。

如果你想要所有珠宝的价值,你应该找到总价值(jewels_list)。当前的元组不是所有宝石的价值,而只是符合最大重量的宝石的价值。

输出元组表示最终解决方案的总值和总权重。

bagged 是一个列表,像这样[[125,3000],[500,6000]]。 函数总价值只是把所有东西加起来。

最新更新