📜  算法|贪婪算法|问题3(1)

📅  最后修改于: 2023-12-03 15:11:33.012000             🧑  作者: Mango

算法 | 贪婪算法 | 问题3

介绍

在计算机科学中,贪婪算法(Greedy Algorithm)是一种在每一步选择中都采取在当前状态下最优的选择,从而希望导致结果是全局最优或近似最优的算法。这种算法贪心地选取问题的最小代价或最大收益,在满足约束条件的情况下尽可能地多获得利益。

在问题3中,我们需要在n个工作中选取尽可能多的工作,以使这些工作不相互冲突,并且完成所有工作的时间总和尽量小。每个工作都有一个开始时间和结束时间。

思路

首先按照结束时间对工作进行排序。选择第一个工作作为当前选择。对于剩余的工作,如果当前工作的结束时间早于下一个工作的开始时间,则选择下一个工作,直到没有可选工作为止。

示例

给定如下工作的起始时间和结束时间。

| 工作编号 | 起始时间 | 结束时间 | | -------- | -------- | -------- | | 1 | 1 | 4 | | 2 | 2 | 6 | | 3 | 3 | 5 | | 4 | 5 | 7 | | 5 | 6 | 9 | | 6 | 8 | 11 |

按照结束时间进行排序后的顺序为:

| 工作编号 | 起始时间 | 结束时间 | | -------- | -------- | -------- | | 1 | 1 | 4 | | 3 | 3 | 5 | | 2 | 2 | 6 | | 4 | 5 | 7 | | 5 | 6 | 9 | | 6 | 8 | 11 |

我们选择第一个工作1,再选择第二个工作3,接着选择第四个工作4,最后选择最后一个工作6。这样我们就选择了4个工作,它们的起始时间和结束时间为:

| 工作编号 | 起始时间 | 结束时间 | | -------- | -------- | -------- | | 1 | 1 | 4 | | 3 | 3 | 5 | | 4 | 5 | 7 | | 6 | 8 | 11 |

这些工作不相互冲突,并且完成所有工作的时间总和为4+2+2+3=11。

代码实现
def select_jobs(jobs):
    # 按照结束时间进行排序
    jobs.sort(key=lambda x: x[1])
    selected = [jobs[0]]
    for job in jobs[1:]:
        if job[0] >= selected[-1][1]:
            selected.append(job)
    return selected

jobs = [(1, 4), (2, 6), (3, 5), (5, 7), (6, 9), (8, 11)]
selected = select_jobs(jobs)
print(selected)
输出结果
[(1, 4), (3, 5), (5, 7), (8, 11)]