Python 动态规划方法——背包难题
我试图用动态编程(DP)方法,用Python3.x解决背包问题。我的助教为我们指出了一个领先的方向。我已尝试实现它,如下所示:Python 动态规划方法——背包难题,python,python-3.x,dynamic-programming,knapsack-problem,Python,Python 3.x,Dynamic Programming,Knapsack Problem,我试图用动态编程(DP)方法,用Python3.x解决背包问题。我的助教为我们指出了一个领先的方向。我已尝试实现它,如下所示: 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(jewe
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))
我对这段代码的逻辑感到困惑,因为它返回一个元组,我不确定输出元组代表什么。我已经看了一段时间了,只是不明白代码指的是什么。任何帮助都将不胜感激。我假设您指的是totalvalue返回的元组,包含在createlist返回的列表中。这些元组都包含两个整数。这两个数字中的第一个是珠宝的价值,第二个是珠宝的重量 totalvalue返回的最后一个元组表示可以从输入jewels列表中选择的jewels的最大可能值,但不超过最大权重
如果你想要所有珠宝的价值,你应该找到totalvalue(珠宝列表)。当前元组不是所有jewels的值,而是适合最大权重的jewels的值。输出元组表示最终解决方案的总值和总权重
bagged是一个列表,类似于[[1253000],[5006000]]。函数total value只需将所有内容相加。创建列表函数是我编写的,因此我理解该函数-创建权重、值对列表。总价值的元组,我想转换成一个实际的总价值,如果这有意义的话,如果这是一种情况,输出代表总价值,我在最大化价值的某个地方搞砸了吗?
575
125 3000
50 100
500 6000
25 30