背包 - 动态编程

时间:2017-03-14 23:52:52

标签: python

我目前对编程任务感到有点困惑 - 因为我需要遵循特定伪代码的结构来解决问题。我也是一个相对缺乏经验的程序员;抱歉,如果这个问题很容易解决。

如果您不熟悉背包问题,代码会获取一个列表(项目),其中包含项目名称,项目权重和项目值。然后它应该创建并输出最低权重和最高价值项目的列表,其中< =最大权重(W)

要遵循的伪代码:

function dpKnapsack(items, W):
    n = len(items)
    T = new int[n][W+1]
    for i in 0..n:     //[0, n-1]
        T[i][0] = 0    // weight == 0
    for j in 1..W+2:   // [0,W+1]
        if items[0].weight <= j:
            T[0][j] = items[0].value
    for i in 1..n:
        for j in 1..W+2:
            if items[i].weight <= j:
                T[i][j] = max(T[i-1][j], items[i].value + T[i][j-items[i].weight])
            else
                T[i][j] = T[i-1][j]
    return T[n-1][W]

我尝试将其翻译为python:

def dp_knapsack(items, W):
    n = len(items)
    T = [[0]*n, [0]*(W+1)]
    # items[0][0] = name of item 0
    # items[0][1] = weight of item 0
    # items[0][2] = value of items 0
    for i in range(0, n):
        T[i][0] = 0
    for j in range(1, (W+2)):
        if items[0][1] <= j:
            T[0][j] = items[0][2]
    for i in range(1, n):
        for j in range(1, (W+2)):
            if items[i][1] <= j:
                T[i][j] = max(T[i-1][j], items[i][2] + T[i][j-items[i][1]])
            else:
                T[i][j] = T[i-1][j]
    return T[n-1][W]

代码运行,但它输出的列表(显着)超过最大权重。

感谢任何和所有帮助,谢谢!

旁注:项目列表是包含随机生成的权重和值的100个项目的列表。该列表是在类似于以下的函数中生成的:

item_list = (
    # name      weight               value
    ("item_00", random.randint(100), random.randint(1000)),    
    ("item_01", random.randint(100), random.randint(1000)),
    ("item_02", random.randint(100), random.randint(1000)),   
    ("item_03", random.randint(100), random.randint(1000)),
    ("item_04", random.randint(100), random.randint(1000)),   
    ("item_05", random.randint(100), random.randint(1000)),
    # . . . etc 

) 

编辑,运行最大权重为50的程序后打印返回列表时得到的输出:

[('item_99', 6, 42), ('item_94', 3, 21), ('item_90', 42, 98), ('item_88', 42, 85), ('item_85', 19, 30), ('item_79', 1, 24), ('item_75', 33, 69), ('item_73', 8, 60), ('item_65', 31, 77), ('item_62', 61, 92), ('item_59', 17, 65), ('item_58', 50, 73), ('item_56', 37, 69), ('item_49', 9, 16), ('item_48', 1, 33), ('item_47', 25, 65), ('item_45', 15, 32), ('item_44', 9, 61), ('item_43', 54, 96), ('item_42', 9, 90), ('item_38', 59, 94), ('item_36', 2, 80), ('item_34', 43, 64), ('item_33', 6, 73), ('item_32', 8, 88), ('item_29', 21, 73), ('item_28', 67, 94), ('item_26', 40, 57), ('item_21', 11, 23), ('item_19', 30, 42), ('item_15', 4, 20), ('item_13', 22, 32), ('item_12', 14, 41), ('item_11', 20, 50), ('item_08', 65, 83), ('item_06', 16, 89), ('item_05', 72, 93), ('item_03', 17, 75), ('item_02', 10, 21)]

0 个答案:

没有答案
相关问题