问题描述:
有一批集装箱要装上一艘载重量为c的轮船,其中集装箱i的重量为Wi。最优装载问题要求确定在装载体积不受限制的情况下,将尽可能多的集装箱装上轮船。
分析:
可用贪心算法求解,采用重量最轻者先装的贪心选择策略,可产生最优装载问题的最优解。具体算法描述如下:
public static float loading(float c,float[]w,int[]x)
{
int n=w.length;
Boxes[]d=new Boxes[n];
for(int i=0;i<n;i++)
d[i]=new Boxes(w[i],i);
MergeSort.mergeSort(d); //使用排序时一定要注意待排序的元素要有可比性
float opt=0;
for(int i=0;i<n;i++)x[i]=0;
for(int i=0;i<n&&d[i].w<=c;i++)
{
x[d[i].i]=1;
opt+=d[i].w;
c-=d[i].w;
}
return opt;
}
public static class Boxes implements Comparable
{
float w;
int i;
public Boxes(float w,int i)
{
this.w=w;
this.i=i;
}
public int compareTo(Object x) //覆写Comparable接口中的方法,方法名以及参数一定要一致
{
float xw=((Boxes)x).w;
if(w<xw)return -1;
if(w==xw)return 0;
return 1;
}
}
总结:
1.本例算法较为简单,注意排序时应具有可比较性。
2.本例中贪心的实质是指,每次选择时总是选择重量最小的。
3.如何应用贪心算法?(1)具有贪心选择性。(2)具有最优子结构性质
碰到类似问题时,可以搜索一下该类问题是否能够用贪心算法去解决。