我一直在尝试编写代码,该代码提供了达到和的方式的解决方案,这是指定的。这与我在网上找到的子集和问题非常相似(Finding all possible combinations of numbers to reach a given sum)。
我稍微修改了代码,以便多次重复使用数字。
object_list = [(2, 50), (3, 100), (5, 140)] # the first number in the tuple is my weight and the second is my cost
max_weight = 17
weight_values = [int(i[0]) for i in object_list]
cost_values = [int(i[1]) for i in object_list]
def subset_sum(objects, max_weight, weights=[]):
w = sum(weights)
if w == max_weight:
print("sum(%s)=%s" % (weights, max_weight))
if w >= max_weight:
return
for i in range(len(objects)):
o = objects[i]
subset_sum(objects, max_weight, weights + [o])
if __name__ == "__main__":
subset_sum(weight_values, max_weight)
print(subset_sum(weight_values, max_weight))
这给出了解决方案:
sum([2, 2, 2, 2, 2, 2, 2, 3])=17
sum([2, 2, 2, 2, 2, 2, 3, 2])=17
sum([2, 2, 2, 2, 2, 2, 5])=17
sum([2, 2, 2, 2, 2, 3, 2, 2])=17
...
等等。 与原始版本不同,我使用元组列表,然后使用元组的第一个值来制作列表。这与最后一个值相同。
我目前所关注的部分是如何存储这些值并在代码的下一部分重用它们。我看过这篇文章但我无法理解它(Python: How to store the result of an executed function and re-use later?) 。
所以我想存储解决方案中存储[2,2,2,2,2,2,3]的解决方案总和([2,2,2,2,2,2] 2,3] = 17。我想为所有解决方案执行此操作,因为在下一步中,我将使用元组的下一部分替换数字(因此2将替换为50,因为2所在的元组是(2,50))。然后我将使用它来打印替换数字的另一个总和值并打印最高值(可能将解决方案从最高到最低排序并打印列表中的第一个值)
我尝试使用字典尝试在计算后替换值,但我无法设法完成。
我试过了:
dictionary = dict(zip(weight_values, cost_values))
感谢任何帮助。在有人要求之前,我已经在网上寻找解决方案而且没有其他人可以向我求助,因为我认识的唯一一个有编码背景的人是我的兄弟,他不在家里