【问题标题】:Minimizing the difference between sums最小化总和之间的差异
【发布时间】:2014-01-10 23:49:51
【问题描述】:

假设您有一个包含 8 个价格的列表 - 例如:

1$
2$
3$
4$
5$
6$
7$
8$

您想将价格分成 2 组,每组 4 个价格。

设一个组的总价格是该组各个价格的总和。您如何划分组以使两个总价格之间的差异尽可能小?

显而易见的解决方案是尝试所有配对,看看哪个是最低的,但如果将其扩展到超过 8 个价格或超过 2 个组,是否有更有效的解决方案?

【问题讨论】:

标签: algorithm search


【解决方案1】:

看起来很无辜,但这是一个超级难题。

显而易见的解决方案是尝试所有配对,看看哪个是 最低,但是如果这样的话,是否有更有效的解决方案可以工作 扩展至超过 8 个价格或超过 2 个组?

只要P != NP:不,一般没有有效的(多项式)解。显而易见的解决方案(AKA 蛮力)具有指数级的复杂性。

令 N = 价格数量,K = 子集数量。

Partition problem for K=2 已经是 NP-complete。因此,广义版本也是 NP 完全的。如果有人能找到一种有效的(多项式)算法,那将意味着 P = NP。

您可以尝试使用次优解决方案,它们会更快,但没有最佳解决方案的保证。对于 K=2,维基百科描述了 pseudo-polynomial time dynamic programming algorithm。对于 K>2:

三分区问题与分区问题完全不同 并且没有伪多项式时间算法,除非 P = NP。为了 分区问题的概括,请参阅Bin packing problem

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-09
    • 1970-01-01
    • 1970-01-01
    • 2020-11-05
    • 2015-05-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多