我想返回元组,使它们的重量加起来达到400,但也不应该重复上课。
因此,下面的最佳解决方案是(项目,重量<400,最大值,没有重复等级,所以1a,1e,1g,1b)
#mytuple = (item, weight, value, class)
mytuple= (('map', 9, 150, 'a'), ('compass', 13, 35, 'a'), ('water', 153, 200, 'a'), ('sandwich', 50, 160, 'a'), ('glucose', 15, 60, 'e'), ('banana', 27, 60, 'g'), ('suntan cream', 11, 70, 'a'), ('waterproof trousers', 42, 70, 'e'), ('waterproof overclothes', 43, 75, 'a'), ('note-case', 22, 80, 'a'), ('sunglasses', 7, 20, 'b'), ('socks', 4, 50, 'a'))
答案 0 :(得分:1)
您可能需要考虑使用set或dictionary(以类作为键),而不是元组的元组。他们更容易操纵。
问题本身就是背包问题,这是一个经典的计算机科学,并在互联网上详尽记录。
最简单(但通常不准确)的解决方案是贪婪的算法,但由于这几乎肯定是一个家庭作业问题,您需要动态编程解决方案 - 因为这是动态编程的规范性介绍。 This is a pretty good overview,带有可读的伪代码和漂亮的表格。
答案 1 :(得分:0)
以下是从列表中删除元素的方法:
>>> a = [1, 2, 3]
>>> a
[1, 2, 3]
>>> a.pop() #remove & return the right-most element
3
>>> a
[1, 2]
>>> a.pop(0) #remove & return element at given index
1
>>> a
[2]
至于你的问题,它是bin packing problem的一个变体,它是NP难的。