问题来自算法导论16.1。
几个相互竞争的活动进行调度,他们要求以独占的方式使用某一公共资源。调度的目标是找出一个最大的相互兼容活动集合。
思想:总是选择剩余活动中具有最早结束时间的活动。
/***************************************************************************** Copyright: 2012, USTC File name: main.cpp Description:Arrange activities by greedy method. Author:Silang Quan Version: 1.0 Date: 2012.12.3 *****************************************************************************/ #include<iostream> #include<vector> using namespace std; //Iteration Method assume a[1] is the first activity meet the need. int GreedySelect(int *s,int *f,int length,int *a) { int i,j=2; a[1]=1; i=1; for(int m=2;m<=length;m++) { if(s[m]>=f[i]) { a[j++]=m; i=m; } } return j; } //Recursion method void GreedySelect2(int *s,int *f,int i,int j,vector<int>& result)// const int started[], const int finished[],vector<int>& result, int i,int j) { if( i >= j ) return; int l; for( l = i+1; l < j; ++l ) { if( s[l] >= f[i] ) { result.push_back(l); break; } } GreedySelect2(s,f,l,j,result); } int main() { int s[12]={0,1,3,0,5,3,5,6,8,8,2,12}; int f[12]={0,4,5,6,7,8,9,10,11,12,13,14}; //test1 /* int a[13]; int i=GreedySelect(s,f,11,a); for(int j=1;j<i;j++) { cout<<a[j]<<" "; } cout<<endl; */ //test2 vector<int> result; GreedySelect2(s,f,0,12,result); for(vector<int>::iterator iter=result.begin();iter!=result.end();++iter) { cout<<*iter<<" "; } cout<<endl; }
参考:
算法导论,第二版,机械工业出版社
算法导论-贪心算法-http://blog.csdn.net/liuzhanchen1987/article/details/7854826