algorithm – 总和小于N的最小子集

我有一个特定的子问题,我无法提出最佳解决方案.这个问题类似于问题的子集和组以及空间填充问题,但我没有看到任何地方提出的这个具体问题.我不一定需要最优解(因为我相对确定它是NP难的),但是有效且快速的近似肯定就足够了.

问题:给定正值整数列表,找到包含整个整数列表的最少数量的不相交子集,其中每个子集总和小于N.显然,原始列表中的整数不能大于N.

在我的应用程序中,我有许多列表,只要它们一起适合矩阵,我就可以将它们连接成矩阵的列.对于下游目的,我希望在得到的不规则矩阵中具有尽可能少的“浪费”空间,因此空间填充相似性.

到目前为止,我采用类似贪婪的方法,从最大整数处理,找到适合当前子集的最大整数N.一旦最小整数不再适合当前子集,我继续下一个子集同样,直到所有数字都用完为止.这几乎肯定没有找到最佳解决方案,但是我能够很快得出最好的解决方案.

奖励:我的应用程序实际上需要批处理,其中每个批次(M)中的子集数量有限制.因此,更大的问题是找到最少的批次,其中每批包含M个子集并且每个子集总和小于N.

最佳答案 直接来自维基百科(有一些大胆的修正):

In the bin packing problem, objects [Integers] of different volumes [values] must be
packed into a finite number of bins [sets] or containers each of volume V [summation of the subset < V] in
a way that minimizes the number of bins [sets] used. In computational
complexity theory, it is a combinatorial NP-hard problem.

https://en.wikipedia.org/wiki/Bin_packing_problem

据我所知,这正是你要找的.

点赞