分配整数对

时间:2012-09-07 18:21:30

标签: algorithm

如何解决这个问题:
我们给出N对整数。对于每对整数,我们必须将一个整数分配给A,将另一个整数分配给B,这样分配给A的整数和分配给B的整数之和之间的差值最小。
我想不出比O(2 ^ N)更好的东西。
我想到了贪婪,但并不总能给出最佳结果。

2 个答案:

答案 0 :(得分:2)

将问题转化为:

给定:一系列非负整数(原始对之间的绝对差异)
问题:将整数划分为两组,以便最小化每个子集的元素总和的绝对差异。

这是NP完整的Balanced Partition Problem。这两个问题是等价的;也就是说,您可以将平衡分区问题转换为您的问题:关联序列,对于序列的每个元素n i ,整数对(n i ,0)。因此,你不会比O(2 N )做得更好。

问题:为每个整数分配一个符号(加号/减号),使得序列总和的绝对值最小。

我怀疑 * 如果你先按降序对序列进行排序,那么贪婪算法会给出最佳结果。这将是一个O(N log N)算法。

* )如果我错了,请发一个反例。

答案 1 :(得分:0)

令对为(A_0,B_0),...,(A_n,B_n)。设D_i = | A_i-B_i |。那么你的问题相当于选择D_i的符号来最小化和,这相当于找到D_i的一个子集,它总和为总和的一半,相当于子集和,即NP-complete。所以你不会比2 ^ n做得更好。

除非:如果数字很小,您可以尝试动态编程方法:如果您可以使用D_0,..,D_i选择与n求和的子集,则DP [i] [n]为真。首先DP [0] [0]为真,如果DP [i] [n]为真或DP [i] [nD [i + 1]]为真,则DP [i + 1] [n]为真真正。 该解决方案是O(n *(最大可能总和))