1. 程式人生 > >貪心演算法 最優裝載問題

貪心演算法 最優裝載問題

轉自: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;  
    }