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

最优装载问题

问题描述:

有一批集装箱要装上一艘载重量为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)+"个集装箱");

    }

}
    原文作者:贪心算法
    原文地址: https://blog.csdn.net/LeeBingNing/article/details/53311423
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞