将一组给定的数字 N 分成两组,使它们的总和之差最小?

Divide a given set of numbers N in two groups such that their difference of their sum is minimum?

您最多可以从集合中排除一个元素以实现目标。 示例:-

N=3

给出的数字是 = 1,2,5

所以,

第 1 组应该是:- [1]

第 2 组应该是:- [2]

我们排除了 5 个,因为我们可以在不属于任何一组的情况下实现较小的差异。

N=4

数字 = 1,2,2,5

Set1 = [1,2,2]

Set2 = [5]

最好的算法是什么? 我知道这是一个 NP 完全问题。 而且我认为蛮力会给我正确的解决方案,但我需要一个可用的算法。

这是将整数集分成两个子集的著名问题的变体,这两个子集的总和相等或尽可能接近相等。但是,您提出的问题更难 - 您还必须检查从原始集合中删除一个元素的所有组合。

由于原始问题是 NP-complete,所以这个问题也是 NP-complete(实际上,这是问题的优化版本,甚至是 NP-hard,正如 Bergi 的回答中正确提到的那样)。好消息是,即使在这个更难的版本中,贪心法在大多数情况下也能给你一个满意的答案。该策略如下:从原始集合中取出最大的元素并将它们放入第一和第二子集中,每个子集中一个。将原始集合中的每个其他元素放入其总和较小的子集中,并迭代地重复该过程,直到您选择了所有元素。

为了获得最佳结果,您需要对原始集合的所有 N 个子集重复此过程,其中您通过删除索引 1,2,...,N 处的元素来获得每个子集。这就是使这个问题变得更加困难的原因。

如果您对更高级的方法感兴趣,请查看 Karmarkar-Karp differencing algorithm

另请参阅:

I know that this a NP-complete problem.

不完全是,partition optimisation problem 甚至被认为是 NP-hard。

And I think that brute force would give me the correct solution but I need an algorithm if available.

NP-hard 意味着没有已知算法(确定解决方案)比蛮力方法表现更好。

因此您可能需要一个 approximation,但只有您知道哪一个适合您的需要。

What is best algorithm for this?

定义"best".