假设您有8个价格的列表 - 例如:
1$
2$
3$
4$
5$
6$
7$
8$
您希望将价格分为两组,每组4个价格。
让一组的总价格为该组个别价格的总和。你如何划分集团,使两个总价格之间的差异尽可能小?
显而易见的解决方案是尝试所有配对并查看哪一对最低,但是如果将其扩展到超过8个价格或超过2个组,是否有更有效的解决方案?
答案 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。