贪心算法 最优装载问题

转自:http://blog.csdn.net/fightingform/article/details/28912983

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

    问题可以描述为:

《贪心算法 最优装载问题》

    该问题可以用贪心算法求解,要使用贪心算法解决问题,我们必须先证明:(1)该问题具备贪心选择性质;(2)该问题具备最优子结构性质.

    首先先证明贪心选择性质:设集装箱已依其重量从大到小排序,(x1,x2…….xn)是最优装载问题的一个最优解。又设k=min{i|xi=1}{ 1<=i<=n}.易知,如果给定的最优装载问题有解,则1<=k<=n;

       《贪心算法 最优装载问题》

    得以证明该问题具备贪心选择性质。

    其次,证明该问题具备最优子结构性质:设(x1,x2….xn)是最优装载的满足贪心选择性质的最优解,易知,x1=1,(x2,x3…..xn)是轮船载重量为c-w1,待装船集装箱为{2,3,…..n}时相应的最优装载问题的最优解。得以证明,该问题具备最优子结构性质。

[cpp] view plain copy print?在CODE上查看代码片派生到我的代码片

    // OptimalLoading.cpp : 定义控制台应用程序的入口点。  
    //  
      
    #include "stdafx.h"  
      
    void outputResult(int *r,int len){  
        printf("结果:");  
        for (int i=0;i<len;i++)  
        {  
            printf("%d\t",r[i]);  
        }  
        printf("\n");  
    }  
    /************************************************************************/  
    /* 冒泡排序                                                                     */  
    /************************************************************************/  
    void sortBox(int *box,int n){  
        for (int i=n-1;i>0;i--)  
        {  
            for(int j=0;j<i;j++){      
                  
                if(box[j]>box[j+1]){  
                    int temp=box[j];  
                    box[j]=box[j+1];  
                    box[j+1]=temp;  
                }  
            }  
        }  
    }  
    /************************************************************************/  
    /* 贪心选择装载                                                                     */  
    /************************************************************************/  
    void loading(int *box,int *r,int w,int n){  
          
        r[0]=1;  
        w-=box[0];  
        for (int i=1;i<n;i++)  
        {  
            if(w-box[i]>=0){  
                w-=box[i];  
                r[i]=1;  
            }  
        }  
          
    }  
    int _tmain(int argc, _TCHAR* argv[])  
    {  
        int w=100;  
        int box[6]={100,20,25,25,20,20};  
        sortBox(box,6);  
        int result[6]={0};  
        loading(box,result,w,6);  
        outputResult(result,6);  
        getchar();  
        return 0;  
    }  

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