你的问题可以证明最后归结为3种情况:
1.全部分配完毕
2.只剩下最多的那种有剩余的(除特殊情况外一般剩1或2)
3.剩下最多的两种有剩余的(除特情况外每种都只剩下1)
直接给算法:
假设随便给出
a 15, b 7, c 9, d 11, e 4
1.排序,选最大的两个(如a,d)取其中数量的较小的那个d为标准。尽量均匀分配3份:
11=3+4+4;分别分配给剩下的3个。这里还要注意分配给剩下的3个时要少于等于他们的数量。2.取(a,d,b) 4 ;(a,d,c) 4; (a,d,e)3;(按b,c,e的数量从大到小对应分配)
这时数量分别为 a 4, b 3, c 5, e 1
 
3.重复1-2过程得到
 (c,a,b) 3, (c,a,e) 1
剩余c 1至此分配完毕这一算法是建立在以下三个推论的基础上的:
1。绝对不会超过3种剩余
2。如果剩余一种,分两种情况:
   一、剩余数量为1或2,则结束
   二、剩余数量大于2,则可寻找没有该种类的两种组合,如该种类为a,则寻找
       bcd,bce,bde,cde这4种组合,如其中有两种组合有数量,设为bcd,bce则可以分别取
       出n,(n=min{(bcd),(bce),(a)/2},即他们中数量最小的一个)组用a替换出不同的两个
       元素,从而和a再组成n/2组。如此重复这一步骤,直到成为一的情况,或者没有可以 
       取的组合。3。如果剩余两种,其中至少一种数量大于一,分两种情况:
   一、假设是a的剩余数量大于一,另一种b数量等于一则可以寻找没有a的组合,即
       bcd,bce,bde,cde这4种组合,中的一种取出一组用a替换出除b外的一个元素,从而
       可以和剩下的a,b组成一组,这样就回到了2。的情况。
   二、假设是a的剩余数量大于一,另一种b数量大于一,大致按一、的方法进行,只是出   
       的组数为n(n=min{(a)/2 , (b), (假设为bcd)}),这样之后就会到达2。或者一、的情况。

解决方案 »

  1.   

    颜色分配方法应该不止一种,但最多数量只有一个结果,感觉二楼的算法不错啊,不过可以改进一下就更好啦,
       想了一个公式来求最多的雪糕数,不过没有经过理论证明,不知对错,请大家指证,
       将五种颜色从大到小排,a1,a2,a3,a4,a5,
       1.若a1<=(int)(a2+a3+a4+a5)/2,可以做(int)(a1+a2+a3+a4+a5)/3个雪糕
       2.若a2>(int)(a2+a3+a4+a5)/2,设b=(int)(a2+a3+a4+a5)/2,将b,a2,a3,a4,a5重新排序,再判断直到满足1的条件为止。   请大家验证一下,只是个人想法,很可能是错的。THX。
      

  2.   

    mc00pzy(whitelie):
    我有事一直没上来,现在才看到你的帖,感谢你的建议,但就是一直不见楼主.....-_-!
    我觉得的确有三种结果,我现在列出另外两种的特殊情况(仅列出分配结果):
    1:只剩下最多的那种有剩余的,假设最多的为a
     (a,b,c) 5;   (a,c,d) 4;   (a,d,e) 3; 
     剩下 a 4
    2:  剩下最多的两种有剩余的a,b
     (a,b,c)5;    (a,b,d)4;    (a,b,e)6
    剩下 a 3 , b 5对于上面两种情况都没办法再进行优化了。对于你的公式,我觉得是正确的,(你的2.中写错了应该是:a1>(int)(a2+a3+a4+a5)/2)
    但是你的结论说“最多数量只有一个结果”是错误的,因为你忽略了你递归后经过排序,最大值将可能不再是a1!另你可能还没完全明白我的算法,我的算法其实只有一次循环就完成了,不需要回朔和递归的。
      

  3.   

    100,7,1,1,1
    你按我的算法应该是这样:
    1,排序,按7标准分为3,2,2
    但之后的1,1,1有限制(我那里写了“这里还要注意分配给剩下的3个时要少于等于他们的数量。”)所以只能分为1,1,1,
    2,取(a,d,b) 1 ;(a,d,c) 1; (a,d,e)1;(按b,c,e的数量从大到小对应分配)
    这时数量分别为 a 97, b 4
    分配完毕了
      

  4.   

    我想每次用最少的那种颜色配上最多的那两种,这样行吗?我还做了几个测试,大家看看吧。
    R:51; G:54; B:4; W:5; O:9; 
    4: G,R,B
    R:47; G:50; B:0; W:5; O:9; 
    5: G,G,W
    R:47; G:40; B:0; W:0; O:9; 
    9: R,G,O
    R:38; G:31; B:0; W:0; O:0; 
    total:18R:13; G:2; B:75; W:8; O:7; 
    2: B,R,G
    R:11; G:0; B:73; W:8; O:7; 
    7: B,R,O
    R:4; G:0; B:66; W:8; O:0; 
    4: B,W,R
    R:0; G:0; B:62; W:4; O:0; 
    total:13R:34; G:65; B:13; W:7; O:4; 
    4: G,R,O
    R:30; G:61; B:13; W:7; O:0; 
    7: G,R,W
    R:23; G:54; B:13; W:0; O:0; 
    13: G,R,B
    R:10; G:41; B:0; W:0; O:0; 
    total:24
      

  5.   

    大家验证一下这个对不对。首先从大到小排序得数组A[5]则if (A[2]>=A[3]+A[4]+A[5]) then total:=A[3]+A[4]+A[5]
      else total:=A[2];
      

  6.   

    FireElement(火元素):
    你好象理解错了题目,题目说每组中不能有相同的颜色的。flyforlove(为情飞):
    第一个if 对,但是else不对.如100,3,2,2,2 就有4种,另外最重要的是给出分配方法吧,光是计算出来最大组数不够吧.
      

  7.   

    My solution:import java.util.*;public class IceCream{
      public static void main(String[] args){
        int[] colors = {100,3,2,2,2};//test array
        System.out.println(Cacl(colors));
      }
      
      private static int Cacl(int[] colors){
        int count = 0;
        Arrays.sort(colors);//sort it first
        while(colors[0] == 0){//One color is used up,colors[0] is the minimum data of the array
          if(colors.length == 3) //if colors.length is 3,cannot make a ice cream
             return 0;
          //remove those zeros in the colors array
          int[] tmpColors = new int[colors.length - 1];
          System.arraycopy(colors,1,tmpColors,0,colors.length - 1); 
          colors = tmpColors;
        }
        
        for(int i = 1; i <= 3; i++)
           colors[colors.length - i]--; //deduce the maximum 3 colors,that is,use the maximum 3 colors to make a icecream each time
        count++;
       
        return count + Cacl(colors); //do some recursive
     
      }
    }
      

  8.   

    各位,不好意思,是我的测试程序有问题。
    现更正。
    思想不变:每次用最少的那种颜色配上最多的那两种。
    新的测试数据如下:
    R:35; G:37; B:20; W:4; O:5; 
    4: G,R,W
    R:31; G:33; B:20; W:0; O:5; 
    5: G,R,O
    R:26; G:28; B:20; W:0; O:0; 
    20: G,R,B
    R:6; G:8; B:0; W:0; O:0; 
    total:29R:8; G:10; B:20; W:7; O:7; 
    7: B,G,O
    R:8; G:3; B:13; W:7; O:0; 
    3: B,R,G
    R:5; G:0; B:10; W:7; O:0; 
    5: B,W,R
    R:0; G:0; B:5; W:2; O:0; 
    total:15R:12; G:19; B:22; W:24; O:12; 
    12: W,B,R
    R:0; G:19; B:10; W:12; O:12; 
    10: G,W,B
    R:0; G:9; B:0; W:2; O:12; 
    2: O,G,W
    R:0; G:7; B:0; W:0; O:10; 
    total:24