(1)问题描述:输入:活动集合S=,每个活动的起始时间集合和每个活动的终止时间,其中1in;输出:S的最大相容集合S'。
(2)问题分析:
相容活动的理解:
贪心思想:
1.选择最早开始时间(不一定是最优解)
反例:
如果按照最早的开始时间,则最大的相容活动只有活动1;但实际的最优解应该是活动2、活动3。
2.选择最早结束时间
不难理解,要构造最优解我们有两种活动选取的方案:a.选择最早结束的活动(由前往后选择)b.选择最晚开始的活动(由后往前选择)
c++代码实现:
//VecF是活动结束时间的升序排列(已排序好)
vector<int> Greedy_Activity_Selector(vector<int> const &VecS, vector<int> const &VecF) {
int n = VecS.size() - 1;//最后一个活动的下标
vector<int> temp_VecA = { 1 };//用于存放最优解序列
int k = 1;//k用于保存当前放入最优解序列的活动下标
for(int m = 1; m <= n; ++m) {
if(VecS[m] >= VecF[k]) {
VecA.push_back(m);
k = m;//k下标的更新
}
}
return VecA;
}