我目前对编程任务感到有点困惑 - 因为我需要遵循特定伪代码的结构来解决问题。我也是一个相对缺乏经验的程序员;抱歉,如果这个问题很容易解决。
如果您不熟悉背包问题,代码会获取一个列表(项目),其中包含项目名称,项目权重和项目值。然后它应该创建并输出最低权重和最高价值项目的列表,其中< =最大权重(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)]