1. 程式人生 > >貪心演算法-會場安排問題

貪心演算法-會場安排問題

貪心演算法特徵: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
*/