现有N个小于50的数字。把他们分成若干组,每组中最多有M个数字,且每组中的数字之和不大于50。先求组数最少的分法?

解决方案 »

  1.   

    这儿有一个更优的方法:
     void fun()
       { 
         排序:按从大到小排成一列L;
     
        while(L非空)
         {      
          将L中从头开始取数并放到一个数组A中,直到总数加上下一个数的和
          大于或等于50停止;然后又从L最后往前取数到该数组A中,直到总数
          加上下一个数的和大于或等于50停止。
          }
        }
      
      

  2.   

    谢谢 I_Love_CPP ,我现在就用的是这个算法,在大部分情况下,都很好。在一下例子中效果就不是特别好:
    23 5 2 1 1 1 1 1 以上8个数字,如果每组最多4个数字,和最大不超过30,按此算法的出分组是{23 5 2},
    {1 1 1 1},{1}三组,而实际上最优是两组,{23 5 1 1},{1 1 1 2}。我想在此算法基础上应该再有一个优化算法,请高手指点!