贪心算法之最优装载
貪心算法通過一系列的選擇來得到問題的解。它所做的每一個選擇都是當前狀態下局部最好選擇。從許多的貪心算法求解的問題可以看到可用貪心算法求解的問題一般具有兩個重要的性質:貪心選擇性質和最優子結構性質。
1、貪心選擇性質
貪心選擇性質是 指所求問題的整體最優解可以通過一系列局部最優的選擇,即貪心選擇來達到。與動態規劃算法的不同之處是貪心算法只依賴在當前狀態下做出最優選擇,然后再去解做出這個選擇后產生的相應的子問題。貪心算法依賴于以往做出的選擇,但是絕不依賴未來做出的選擇。所以貪心算法是自頂向下解決問題的。
2、最優子結構性質
當一個問題的最優解包含其子問題的最優解時,稱此問題具有最優子結構性質。一個問題是否具有最優子結構性質是該問題可用動態規劃算法或貪心算法求解的關鍵特征。
下面是貪算法的最簡單的一個實例,最優裝載問題:
問題描述:
有一批集裝箱要裝上一艘載重量為c的貨船。其中集裝箱i的重量為n[i],問在不受體積限制的情況下,將盡可能多的集裝箱裝上船?
貪心算法之最優裝載算法:
1、選擇重量小的先裝,所以首先需要排序。
2、不斷裝載,則是循環,要輸出最優裝載方案,則是需要進行記錄裝載
到的位置的。使用loading記錄現在的裝載量
void Load(int data[],int n,int c) //最優裝載函數
{int pos=0,i=0;int loading=0;InsertSort(data,n); //排序while(loading<c&&i<n) //如果總和還是小于c,i就有可能持續增大越界,這里需要加上條件限制{loading+=data[i];i++;}pos=--i; //循環內部i在loading不滿足小于c時還加了1,這里減掉cout<<"最優裝載方案為:"<<endl;for(int j=0;j<=pos;j++)cout<<":"<<data[j]<<"-->"<<endl;cout<<"最多可以裝載的集裝箱數:"<<pos<<endl;}
?該問題的時間復雜度取決于排序函數的時間復雜度,這里采用的直接插入排序,所以時間復雜度為O(n^2)
?
?
轉載于:https://www.cnblogs.com/fistao/archive/2013/04/04/2999794.html
總結
- 上一篇: 吴磊的QQ是多少要真的
- 下一篇: 维修电视多少钱啊?