Python 最小化组数,其中组元素的总和低于某个值

Python 最小化组数,其中组元素的总和低于某个值,python,algorithm,optimization,Python,Algorithm,Optimization,假设我有一个包含10项的列表和一个最大值: items = [1, 2, 4, 4, 10, 10, 15, 18, 21, 22] max_sum = 30 我想对项中的元素进行分组,并且我想找到组的最小数目,前提是每个组中的元素总和小于预设值max\u sum,其中项的所有元素都小于max\u sum 算法的总体思路: 初始化1)空列表new\u组,2)组中的floatspace\u left=(max\u sum-sum(new\u组)) 找到最大的项目,使项目剩余空间,重新开始 计数

假设我有一个包含10项的列表和一个最大值:

items = [1, 2, 4, 4, 10, 10, 15, 18, 21, 22]
max_sum = 30
我想对
项中的元素进行分组,并且我想找到组的最小数目,前提是每个组中的元素总和小于预设值
max\u sum
,其中
项的所有元素都小于
max\u sum

算法的总体思路:

  • 初始化1)空列表
    new\u组
    ,2)组中的float
    space\u left
    =(max\u sum-sum(new\u组))
  • 找到最大的项目,使项目
    剩余空间
    ,重新开始
  • 计数周期以查找组的最小数目
  • 因此,对于给定的值,该算法将产生4组:

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

    我认为我的上述方法会奏效,但我想知道是否有更直接/更好的方法。谢谢

    你的方法行不通。您使用的贪婪算法可能会导致某些组中出现未使用的空间。例如:

     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]
    
    如评论中所述,这是众所周知的箱子包装问题。如果你想进一步阅读,除了评论中提供的链接,你还可以看一看。

    你应该看看,这正是你的问题,在这方面已经有很多研究。