任务安排问题

(1)问题描述:输入:活动集合S=\left \{ 1,2,...,n \right \},每个活动的起始时间集合\left \{ s_{i} \right \}和每个活动的终止时间\left \{f _i{} \right \},其中1\leqi\leqn;输出: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;
}

猜你喜欢

转载自blog.csdn.net/m0_56603583/article/details/122580236
今日推荐