2015-02-07 56 views
3

您可以免除集中的最多一个元素以实现目标。 例如: -将一组给定的数字N分成两组,使它们的和的差值最小?

N = 3个

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

所以,

组1应该是: - [1]

集2应该是: - [2]

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

N = 4

数= 1,2,2,5

SET1 = [1,2,2]

SET2 = [5]

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

+0

伪多项式时间可以使用吗? – harold 2015-02-07 10:40:27

回答

1

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

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

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

NP-hard意味着没有已知的算法(以确定解决方案)比强力方法执行得更好。

所以你可能需要一个​​,但哪一个只适合你的需要,只有你可以知道。

什么是最好的算法呢?

定义“最佳”。

0

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

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

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

如果您对更先进的方法感兴趣,请看Karmarkar-Karp differencing algorithm

参见:

相关问题