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