最小化组的数量,其中组元素的总和低于特定值

时间:2017-04-25 02:31:27

标签: python algorithm optimization

我们说我有一个包含10个项目的列表和一个max_sum:

items = [1, 2, 4, 4, 10, 10, 15, 18, 21, 22]
max_sum = 30

我想对items中的元素进行分组,并且我想找到最小数量的组,前提是每个组中的元素总和小于预设值max_sumitems的所有元素都小于max_sum

算法的一般概念:

  • 初始化1)空列表new_group,2)在space_left组中浮动=(max_sum - sum(new_group))
  • 找到最大的项目,例如项目< = space_left
  • 将最大的项目附加到new_group
  • 更新space_left
  • items
  • 中删除项目
  • 一次min(items)> space_left,重新开始
  • 计算周期以查找最小组数

因此,对于给定的值,该算法将产生4组:

[22, 4, 4]
[21, 2, 1]
[18, 10]
[15, 10]

我认为我的上述方法可行,但我想知道是否有更直接/更好的方法。谢谢!

1 个答案:

答案 0 :(得分:3)

您的方法无效。您使用贪婪算法可能会导致某些组中未使用的空间。 E.g:

 items = [13, 11, 10, 10, 9, 7]
 max_sum = 30

 First group  => [13, 11] (leaving a diff of 6)
 Second group => [10, 10, 9] (leaving a diff of 1)
 Third group  => [7]

这显然更好的分区为

First group  => [13, 10, 7]
Second group => [11, 10, 9]

如评论中所述,这是众所周知的装箱问题。如果您想进一步阅读,除了评论中提供的链接外,您还可以查看Wikipedia

相关问题