如何最大化加减组合?

时间:2019-08-11 20:46:36

标签: python optimization quantitative-finance algorithmic-trading maximization

假设我有一个包含10个元素的列表[a,b,c,d,e,f,g,h,i,j],并且我可以将每个元素乘以0、1、2,-1,-2

我使用的乘法因子总数必须等于零。即,如果我将五个数字乘以-1,则必须将其他五个数字乘以1,或者我可以将a乘以2,b和c乘以-1,其余乘以0。

我想找到此操作产生的最大清单。

如何使用python进行编码?

我已经尝试对[2,1,0,-1,-2]的每个迭代进行编码,并删除未加到0的列表,然后乘以原始列表,但是我陷入了困境。

1 个答案:

答案 0 :(得分:1)

您可以对列表进行排序,从两端向中心扫描,将2分配给较大的元素,将-2分配给较小的元素。

def baby_knapsack(xs):
    xs = sorted(xs, reverse=True)
    res =  list()
    n = len(xs)
    for i in range(n//2):
        res.extend(((xs[i], 2), (xs[-1-i], -2)))
    if n % 2 == 1:
        res.append((xs[n//2], 0))
    return res

xs = [-10, -5, 0, 5, 10, 15]

# In [73]: q.baby_knapsack(q.xs)                                           
# Out[73]: [(15, 2), (-10, -2), (10, 2), (-5, -2), (5, 2), (0, -2)]