你的问题可以证明最后归结为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.全部分配完毕
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。或者一、的情况。
想了一个公式来求最多的雪糕数,不过没有经过理论证明,不知对错,请大家指证,
将五种颜色从大到小排,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。
我有事一直没上来,现在才看到你的帖,感谢你的建议,但就是一直不见楼主.....-_-!
我觉得的确有三种结果,我现在列出另外两种的特殊情况(仅列出分配结果):
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!另你可能还没完全明白我的算法,我的算法其实只有一次循环就完成了,不需要回朔和递归的。
你按我的算法应该是这样:
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
分配完毕了
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
else total:=A[2];
你好象理解错了题目,题目说每组中不能有相同的颜色的。flyforlove(为情飞):
第一个if 对,但是else不对.如100,3,2,2,2 就有4种,另外最重要的是给出分配方法吧,光是计算出来最大组数不够吧.
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
}
}
现更正。
思想不变:每次用最少的那种颜色配上最多的那两种。
新的测试数据如下:
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