【发布时间】:2013-11-03 12:30:27
【问题描述】:
我有一组整数 M 和一个目标总和 k。我想找到 M 的子集,当它加在一起时最接近 k 而不会超过。
例如:
M = {1, 3, 5, 5, 14}
k = 12
answer = {1, 5, 5}
because 1 + 5 + 5 = 11 and there is no way to make 12.
我有一个额外的约束,即子集最多可以包含 4 个元素。
在我的应用程序中,|M| 的大小可以很大(大约有数千个元素)。如果无法在合理的时间内找到最佳答案,我会对至少给出“好”答案的解决方案感兴趣。
现在我正在通过生成 10,000 个随机子集并选择最接近的子集来解决这个问题,这比人们预期的要好,但速度很慢。我不确定这实际上离最优还有多远,但我对此的任何见解都会很有趣。
【问题讨论】:
-
再确认一下,您想要实际的子集,而不仅仅是总和?
-
单个整数值有多大?其中有没有负面影响?
-
整数都是正数。它们跨越大约 7 个数量级(即从 1 到 1M),但大多数是 [1...10000]。
-
是的,我正在寻找最大阶数为 4 的最接近的子集。
标签: algorithm optimization set mathematical-optimization packing