小编典典

给定N个整数的绝对值,可以找到总和最接近0的N / 2个负值和N / 2个正值的组合

algorithm

假设我有10个数字组成的数组,其绝对值范围可以从1到10。可以重复的值。一个例子可能是

{2, 4, 2, 6, 9, 10, 1, 7, 6, 3}.

我们可以为这些数字中的每一个分配一个正号或负号,但是每种组合中都应始终有5个负数和5个正数

{-2, -4, 2, -6, 9, 10, 1, 7, -6, -3}
{2, -4, -2, 6, -9, 10, -1, 7, -6, 3}

遵循此规则的可能排列。

我想在给定集合的半正值和半负值的所有可能排列中,找到值最接近0的最小正或负总和。

有什么建议?我觉得这个问题在计算上非常费力,而且我不确定是否有一种解决方案不是蛮力的(例如,枚举所有排列,然后应用最接近的3Sum的变体)。


阅读 308

收藏
2020-07-28

共1个答案

小编典典

首先对数组排序,然后将最大的数放入负数组,然后将第二大的数放入正数组。将一个最大数设置为正数,直到它们的总和大于零。现在设置另一个负数。重复此操作,直到设置为5负数为止。这是贪婪算法。看来您的问题是np完全的,看起来像AST问题,但是问题的大小限制为10,因此您可以通过蛮力搜索解决它,只需检查C(10,5)<10
^ 5可能性对于当今的PC,这个数字很小。

此外,如果能够选择的套不同大小,你的问题是一样的子集和问题可以在伪多项式时间内解决看它:12

2020-07-28