给定一个(1xN)正权重列表(不一定是整数,即浮点数)和相等成本的等长(1xN)列表,我想找到权重列表的子集,它与给定的总和S和具有最低成本(与权重列表中的子集相对应的成本*权重之和)。用Python编写将是最好的(如果可能的话),因为我对其他语言不太好!
示例:
w = [2.5, 3.0, 1.0, 5.5] # Weight list
c = [1.0, 1.5, 2.0, 3.0] # Cost list
S = 6.5 # Target sum
对于这种情况,我们有两个可能的子集,它们总和为S:
sub1 = [2.5, 3.0, 1.0]
sub2 = [1.0, 5.5]
这些子集的成本是:
cost1 = 2.5*1.0+3.0*1.5+1.0*2.0 = 9.0
cost2 = 1.0*2.0+5.5*3.0 = 18.5
由于子集1的成本最低(9.0),因此这是我想要的子集。
一种可能的解决方案当然是计算所有可能的组合,然后选择最小的计算成本。我希望有一个更有效的解决方案来解决这个问题。
我已经搜索了不同的解决方案,但我只能找到解决方案,解决了总和的问题,而不是同时获得最低的成本。以下是此类解决方案的示例:Algorithm to find which number in a list sum up to a certain number。
答案 0 :(得分:0)
我终于使用John Coleman建议的二进制整数编程解决了这个问题。以下是代码:https://github.com/sebastianheg/knapsack-problem。