本帖最后由 Mike_python小 于 2023-7-27 17:14 编辑
在计算机科学中,贪心算法是一种通过每一步的局部最优选择来达到全局最优解的算法策略。贪心算法通常适用于求解最优化问题,且问题具备贪心选择性质,即通过选择当前最优解来进行求解,并不会回溯或者考虑未来可能的情况。
假设有一个需要安排的活动列表,每个活动都有一个开始时间和结束时间。只有一个资源可以被用于一次活动,而且每个活动都需要独占使用这个资源。要求设计一个算法,从活动列表中选出最大数量的互不相容的活动。
例如,给定活动列表如下:
活动编号 | 开始时间 | 结束时间
--------|---------|--------
A1 | 1 | 4
A2 | 3 | 5
A3 | 0 | 6
A4 | 5 | 7
A5 | 3 | 9
A6 | 5 | 9
A7 | 6 | 10
A8 | 8 | 11
A9 | 8 | 12
A10 | 2 | 14
要求选择出的互不相容的活动数量最大。
1. 将活动列表按照结束时间进行升序排序,选择最早结束的活动作为第一个活动。
2. 从剩余的活动中,选择开始时间晚于上一个选中活动结束时间的活动,将其加入到选择集合中,并更新上一个选中活动。
3. 重复步骤2,直到所有活动遍历完毕。
#include <iostream>
#include <vector>
#include <algorithm>
// 活动结构体
struct Activity {
int start;
int end;
};
// 比较函数,按照结束时间升序排序
bool compare(Activity a, Activity b) {
return a.end < b.end;
}
// 寻找最大数量的互不相容活动
int findMaxActivities(std::vector<Activity>& activities) {
// 对活动进行排序
std::sort(activities.begin(), activities.end(), compare);
int count = 1; // 至少有一个活动可以选择
int prevEnd = activities[0].end; // 第一个活动的结束时间
// 从剩余活动中选择
for (int i = 1; i < activities.size(); i++) {
if (activities[i].start >= prevEnd) {
count++;
prevEnd = activities[i].end;
}
}
return count;
}
int main() {
std::vector<Activity> activities = {
{1, 4},
{3, 5},
{0, 6},
{5, 7},
{3, 9},
{5, 9},
{6, 10},
{8, 11},
{8, 12},
{2, 14}
};
int maxActivities = findMaxActivities(activities);
std::cout << "最大互不相容活动数量: " << maxActivities << std::endl;
return 0;
}
|