貪心演算法 最優裝載問題
阿新 • • 發佈:2019-02-09
轉自: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; }