【发布时间】:2014-04-18 18:58:38
【问题描述】:
给定一个整数列表l,我如何将它分成两个列表a 和b,使得d(a,b) = abs(sum(a) - sum(b)) 最小。我知道问题是 NP 完全的,所以我正在寻找一个伪多项式时间算法,即O(c*n) 其中c = sum(l map abs)。我查看了Wikipedia,但是那里的算法将它分成精确的两半,这是我正在寻找的一个特例......
编辑:
为了澄清,我正在寻找确切的分区 a 和 b 而不仅仅是由此产生的最小差异 d(a, b)
概括地说,什么是伪多项式时间算法,用于将n 数字列表划分为k 组g1, g2 ...gk 使得(max(S) - min(S)).abs 在S = [sum(g1), sum(g2), ... sum(gk)] 处尽可能小
【问题讨论】:
-
编辑过的问题(概括)完全改变了事情。 k-partitioning 是强 NP-Complete,没有已知的伪多项式解。
标签: algorithm big-o dynamic-programming partitioning np-complete