我正在尝试找到一种算法,但谷歌搜索我的确切问题并不是找到我需要的确切结果。
我获得了一组数字和目标总和。我需要将数字分配给组,以便这些组的总和尽可能接近而不超过目标值。
Example Target Sum = 99
Example Set = { 70, 40, 10, 70, 98, 14, 4, 7, 29, 11, 91, 50, 30 }
期望的结果将是:
{ 70, 29 }
{ 40, 50, 7}
{ 98 }
{ 91, 4 }
{ 70, 10, 11 }
{ 30, 14 }
...因为它们都加起来接近99.
目标是尽可能少的群体。 我不需要担心资源问题。它将被谨慎执行,并且值的数量将非常少。
答案 0 :(得分:4)
如果目标是最小化组的数量,并且唯一的限制是每个组的总大小可能不超过目标值,则所考虑的问题是bin packing问题,{{3} }优化问题,相对较好理解。
一般而言,相对简单的启发式方法称为First Fit或First Fit Decreasing,产生的近似比率小于2.更准确地说,First Fit Decreasing产生的紧密比率为(11/9)OPT+(6/9)
。 Bin打包不允许PTAS(因此没有FPTAS),但是渐近PTAS的比率为(1+epsilon)OPT+1
,其中epsilon
是准确度参数。
如果需要一个具有相对简单实施的合适解决方案,First Fit Decreasing可能是候选人。