貪心演算法-會場安排問題
阿新 • • 發佈:2018-12-31
貪心演算法特徵:1:貪心選擇性質;2:最優子結構:('動態規劃'),具體依情況而定。
貪心演算法性質: 雖不能對所有問題都能得到整體最優解,但是對於範圍較廣的許多問題得到其整體最優解。如‘単源最短路徑', '最小生成樹' 等。貪心演算法是對許多整體最優解的近似解。
貪心演算法思想:
從問題的某一個初始解出發逐步逼近給定的目標,以儘可能快的地求得更好的解。當達到演算法中的某一步不能再繼續前進時,演算法停止。
(演算法侷限)
1. 不能保證求得的最後解是最佳的;
2. 不能用來求最大或最小解問題;
3. 只能求滿足某些約束條件的可行解的範圍。
PS: 可參考 :揹包問題可以用貪心演算法求解,但0-1揹包問題不能用貪心演算法求解。
實現該演算法的過程:
從問題的某一初始解出發,一直往下走,找出餘下的“最優”解。由所有解元素組合成問題的一個可行解。
題意:要在足夠多的會場裡安排一批活動,希望使用最少的會場。
程式碼:
/** @貪心演算法-會場安排 @author 狂熱的coder */ #include<iostream> #include<algorithm> #define MAX_NUM 50 using namespace std; typedef struct tnode{ int start; //起始時間 int end; //結束時間 }tnode,Tnode[MAX_NUM]; bool cmp(tnode a,tnode b){ //對活動結束時間進行排序 return a.end<b.end; } int MinArrange(int n){ Tnode t; for(int i = 0;i<n;i++){ cin>>t[i].start>>t[i].end; } sort(t,t+n,cmp); int count = 1; int item = t[0].end; //排序後第一個計入總規劃中 for(int i = 1;i<n;i++){ if(t[i].start>=item){ //找出在活動結束後的最小起始時間的下一活動· item = t[i].end; count++; }else{ ; } } return count; } int main(){ int n; cin>>n; cout<<"使用最少會場數為:"<<MinArrange(n); return 0; } /* 5 1 23 12 28 25 35 27 80 36 50 */