将一组给定的数字N除以两组,使得它们的总和差异最小?

时间:2015-02-07 09:27:07

标签: algorithm numbers partition-problem

你可以从集合中豁免最多一个元素来实现目标。 例如: -

N = 3

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

所以,

第1组应为: - [1]

第2组应该是: - [2]

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

N = 4

数字= 1,2,2,5

Set1 = [1,2,2]

Set2 = [5]

这个的最佳算法是什么? 我知道这是一个NP完全问题。 我认为蛮力会给我正确的解决方案但我需要一个算法(如果有的话)。

2 个答案:

答案 0 :(得分:1)

  

我知道这是一个NP完全问题。

不完全是,partition optimisation problem甚至已知是NP难的。

  

我认为蛮力会给我正确的解决方案但我需要一个算法(如果有的话)。

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

所以你可能需要一个approximation,但哪一个只能满足你的需求。

  

什么是最佳算法?

定义"最佳"。

答案 1 :(得分:0)

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

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

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

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

另见: