你可以从集合中豁免最多一个元素来实现目标。 例如: -
N = 3
给出的数字是= 1,2,5
所以,
第1组应为: - [1]
第2组应该是: - [2]
我们排除了5,因为我们可以在没有任何一组的情况下实现较小的差异。
N = 4
数字= 1,2,2,5
Set1 = [1,2,2]
Set2 = [5]
这个的最佳算法是什么? 我知道这是一个NP完全问题。 我认为蛮力会给我正确的解决方案但我需要一个算法(如果有的话)。
答案 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。
另见: