活动安排问题
贪心算法
先对活动按照结束时间升序排序,此处省略排序步骤
贪心策略是:只要后者的开始时间大于等于前者的结束时间(即s[i]>=f[j])就选择
#include <iostream> using namespace std; const int N=1005; int GreedySelector(int n,int s[],int f[], bool a[]) { a[1]=true; int j=1; int cnt=1; for(int i=2;i<=n;i++){ if (s[i]>=f[j]){ a[i]=true; j=i; cnt++; } else a[i]=false; } return cnt; } int main() { int s[]={0,1,3,0,5,3,5,6,8,8,2,12};//开始时间 int f[]={0,4,5,6,7,8,9,10,11,12,13,14};//结束时间 bool b[N]; int n=(sizeof(s)/sizeof(s[0])); cout<<"活动安排数量: "<<GreedySelector(n,s,f,b)<<endl; cout<<"安排如下:"<<endl; for(int i=1;i<=n;i++){ if(b[i]) cout<<"活动 "<<i<<" :"<<s[i]<<"-"<<f[i]<<endl; } return 0; }
另一种函数传递数组并在函数中获取数组长度
#include <iostream> using namespace std; const int N=1005; template<class T> int greedySelector(T& s,T& f,bool a[]) { int n=sizeof(s)/sizeof(s[0]);//获得长度 a[1]=true; int j=1; int cnt=1; for(int i=2;i<=n;i++){ if (s[i]>=f[j]){ a[i]=true; j=i; cnt++; } else a[i]=false; } return cnt; } int main() { int s[]={0,1,3,0,5,3,5,6,8,8,2,12};//开始时间 int f[]={0,4,5,6,7,8,9,10,11,12,13,14};//结束时间 bool b[N]; int n=sizeof(s)/sizeof(s[0]); cout<<"活动安排数量: "<<greedySelector(s,f,b)<<endl; cout<<"安排如下:"<<endl; for(int i=1;i<=n;i++){ if(b[i]) cout<<"活动 "<<i<<" :"<<s[i]<<"-"<<f[i]<<endl; } return 0; }
运行结果如下: