我有一个特定的子问题,我在想出最佳解决方案时遇到了麻烦。这个问题类似于子集和组问题以及空间填充问题,但我还没有在任何地方看到过这个特定问题。我不一定需要最佳解决方案(因为我相对确定它是 NP 难的),但是有效且快速的近似肯定就足够了。
问题:给定一个正值整数列表,找到包含整个整数列表的最少数量的不相交子集,其中每个子集的总和小于 N。显然原始列表中的任何整数都不能大于 N。
在我的应用程序中,我有许多列表,只要它们适合矩阵,我就可以将它们连接到矩阵的列中。出于下游目的,我希望在生成的参差不齐的矩阵中尽可能少地“浪费”空间,因此空间填充相似。
到目前为止,我采用了一种类似贪婪的方法,从最大整数向下处理,并在限制 N 下找到适合当前子集的最大整数。 一旦最小整数不再适合当前子集,我将继续下一个子集以此类推,直到所有数字都用完为止。这几乎可以肯定没有找到最佳解决方案,但这是我能快速想出的最佳解决方案。
奖励:我的应用程序实际上需要批次,其中每批次 (M) 中的子集数量有限制。因此,更大的问题是找到最少的批次,其中每个批次包含 M 个子集,并且每个子集的总和小于 N。