我有一个特定的子问题,我无法提出最佳解决方案。这个问题类似于问题的子集和组以及空间填充问题,但我没有看到任何地方提出的这个具体问题。我不一定需要最优解(因为我相对确定它是NP难的),但有效且快速的近似肯定就足够了。
问题:给定正值整数列表,找到包含整个整数列表的最少数量的不相交子集,其中每个子集总和小于N.显然原始列表中没有整数可以是大于N。
在我的应用程序中,我有很多列表,只要它们一起放在矩阵中,我就可以将它们连接成矩阵的列。对于下游目的,我希望在产生的参差不齐的矩阵中留下很少的“浪费”空间,因此空间填充相似性。
到目前为止,我采用类似贪婪的方法,从最大整数处理,找到适合当前子集的最大整数N.一旦最小整数不再适合当前子集,我继续类似的下一个子集,直到所有数字都用完为止。这几乎肯定没有找到最佳解决方案,但是我能够很快得到它。
BONUS :我的应用程序实际上需要批处理,每个批次中的子集数量(M)都有限制。因此,更大的问题是找到最少的批次,其中每批包含M个子集,每个子集总和小于N.
答案 0 :(得分:2)
直接来自维基百科(有一些大胆的修正):
在装箱问题中,不同卷[值]的对象[整数]必须为 打包到有限数量的箱[集]或容器V <子集的总和&lt; V ] 一种最小化使用的容器数量[集合]的方法。在计算中 复杂性理论,它是一个组合的NP难问题。
https://en.wikipedia.org/wiki/Bin_packing_problem
据我所知,这正是你要找的。 p>