贪心算法:最优装载问题(java版本)

来源:互联网 发布:js随机数1到10 编辑:程序博客网 时间:2024/06/07 04:52

最优装载问题

问题描述:

有一批集装箱要装上一艘载重量为c的轮船。其中集装箱i的重 量为wi
最优装载问题要求确定在装载体积不受限制的情况下,将尽可能多的集装箱装上轮船

解决方案:

写三个类
Element类是个javaBean,属性是集装箱的重量和编号
MergeSort类用来排序(采用递归算法的快速排序)
LoadingMain类是解决最优装载问题的主类,并带有主方法和测试数据

Element 类:

public class Element implements Comparable{    int w;//集装箱的重量    int i;//集装箱编号    public Element(int w, int i) {        super();        this.w = w;        this.i = i;    }    @Override    public int compareTo(Object obj) {        float weight=((Element) obj).w;        if(w<weight) return -1;        if(w==weight) return 0;        return 1;    }    public int getW() {        return w;    }    public void setW(int w) {        this.w = w;    }    public int getI() {        return i;    }    public void setI(int i) {        this.i = i;    }}

MergeSort类:

public class MergeSort {    public static void mergeSort(Element nums[],int low,int high){        if(low<high){//至少有两个元素            int mid=(low+high)/2;//取中点            //左边            mergeSort(nums,low,mid);            //右边            mergeSort(nums,mid+1,high);            //左右归并            merge(nums,low,mid,high);        }    }    private static void merge(Element[] nums,int low,int mid,int high) {        //合并c[1:m]和c[m+1:r]到d[l:r]                int i=low,j=mid+1,k=0;                Element temp[]=new Element[high-low+1];                //把数排好序放进temp数组中                while((i<=mid)&&(j<=high)){                    //把小的的放进temp数组中                    if(nums[i].getW()-nums[j].getW()<=0)                        temp[k++]=nums[i++];                    else                        temp[k++]=nums[j++];                }                //若左边的先遍历完,则把右边剩下的放进temp数组中                while(i<=mid)                    temp[k++]=nums[i++];                //若右边的先遍历完,则把左边剩下的放进temp数组中                while(j<=high)                    temp[k++]=nums[j++];//              把temp中的数放回nums数组中                for(int p = 0;p<temp.length;p++){                    nums[low+p]=temp[p];                }    }}

LoadingMain类:

/*最优装载 * 有一批集装箱要装上一艘载重量为c的轮船。其中集装箱i的重量为wi。 * 最优装载问题要求确定在装载体积不受限制的情况下,将尽可能多的集装箱装上轮船*/public class LoadingMain {    /*float c:轮船的载重量,float[] w:第i个集装箱的重量,     * int[] x:取0或1 0代表不装入集装箱i,1代表装入集装箱i*/    public static int loading(int c,int[] w,int[] x){        int n=w.length;//n代表集装箱的个数        Element[]d=new Element[n];//n个存着集装箱编号和重量的Element元素组成一个数组        for(int i=0;i<n;i++)//n次循环,给数组中的每一个元素装上值            d[i]=new Element(w[i], i);        MergeSort.mergeSort(d,0,d.length-1);//数组中元素按照集装箱重量由小到大排序        int opt=0;        for(int i=0;i<n;i++) x[i]=0;//所有集装箱一开始都没有装上船,所以把x置为0        for(int i=0;i<n&&d[i].w<c;i++){            x[d[i].i]=1;//相应编号的集装箱的装入标志设为1            opt++;            c-=d[i].w;        }        return opt;//返回的是装入集装箱的个数    }    public static void main(String[] args) {        int c=50;        int[] w={7,35,25,15,10,4,3,2};        int[] x={0,0,0,0,0,0,0,0};        System.out.println("最多装入"+loading(c, w, x)+"个集装箱");    }}
0 0
原创粉丝点击