最小化总和之间的差异

时间:2014-01-10 23:49:52

标签: algorithm search

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

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

您希望将价格分为两组,每组4个价格。

让一组的总价格为该组个别价格的总和。你如何划分集团,使两个总价格之间的差异尽可能小?

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

1 个答案:

答案 0 :(得分:1)

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

  

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

只要P != NP:不,通常没有有效的(多项式)解决方案。而明显的解决方案(AKA暴力)具有指数复杂性。

设N =价格数,K =子集数。

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

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

  

3分区问题与分区问题完全不同   除非P = NP,否则没有伪多项式时间算法。对于   分区问题的概括,请参阅Bin packing problem