在计算机科学中,贪心算法是一种在每一步选择中都采取当前状态下最好或最优(即最有利)的选择,从而希望导致结果是最好或最优的算法策略。今天,我们将通过一个经典问题——活动选择问题,来深入理解贪心算法,并使用 C# 语言 实现它。无论你是编程新手还是有一定基础的学习者,这篇算法教程都会让你轻松掌握核心思想。

假设你是一个会议室管理员,每天有很多人申请使用会议室举办活动。每个活动都有一个开始时间和结束时间。你的任务是安排尽可能多的互不冲突的活动(即任意两个活动的时间不能重叠)。这就是著名的活动选择问题。
例如:
显然,A 和 B 冲突,但 A 和 C 不冲突。所以最多可安排两个活动:A 和 C。
这个问题具有贪心选择性质和最优子结构,非常适合用贪心算法解决。关键在于:**总是优先选择最早结束的活动**。这样可以为后续活动留下最多的时间空间,从而最大化活动数量。
我们将按以下步骤实现:
using System;using System.Collections.Generic;using System.Linq;class Activity{ public string Name { get; set; } public int Start { get; set; } public int Finish { get; set; } public Activity(string name, int start, int finish) { Name = name; Start = start; Finish = finish; }}class Program{ static void Main() { // 创建活动列表 List<Activity> activities = new List<Activity> { new Activity("A", 1, 4), new Activity("B", 3, 5), new Activity("C", 0, 6), new Activity("D", 5, 7), new Activity("E", 8, 9), new Activity("F", 5, 9) }; // 按结束时间升序排序 var sortedActivities = activities.OrderBy(a => a.Finish).ToList(); Console.WriteLine("选中的活动:"); SelectActivities(sortedActivities); } static void SelectActivities(List<Activity> activities) { if (activities.Count == 0) return; // 第一个活动总是被选中(因为它结束最早) Activity lastSelected = activities[0]; Console.WriteLine(lastSelected.Name); // 从第二个活动开始遍历 for (int i = 1; i < activities.Count; i++) { // 如果当前活动的开始时间 >= 上一个选中活动的结束时间 if (activities[i].Start >= lastSelected.Finish) { Console.WriteLine(activities[i].Name); lastSelected = activities[i]; } } }}1. Activity 类用于表示每个活动,包含名称、开始时间和结束时间。
2. 使用 OrderBy(a => a.Finish) 对活动按结束时间升序排序——这是贪心策略的核心。
3. 在 SelectActivities 方法中,我们首先选择第一个活动(结束最早),然后依次检查后续活动是否与上一个选中的活动冲突(即当前活动的开始时间 ≥ 上一个活动的结束时间)。
运行上述代码,输出为:
选中的活动:ADE
通过本教程,我们学习了如何使用 贪心算法 解决 活动选择问题,并用 C# 实现 了完整的解决方案。这种思路不仅适用于会议室调度,还可用于课程安排、任务调度等实际场景。
记住贪心算法的关键:**局部最优选择 → 全局最优解**(前提是问题具备贪心选择性质)。希望这篇 算法教程 能帮助你迈出算法学习的第一步!
继续练习,你也能成为算法高手!
本文由主机测评网于2025-12-12发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/2025126890.html