最早结束时间安排活动--贪心算法证明

本文探讨了贪心算法在活动安排问题中的应用,通过数学归纳法证明了每次选择最早结束活动的策略能够达到最优解,即在限定时间内安排最多的活动。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

活动安排的最优解,一般是贪心算法的思路求取.每一次选择 相对于当前时间 最早结束的活动,得到的子序列是活动的一个最优安排,即在一段时间内安排的活动数最多.

设定命题

贪心算法执行到第k步,选择了k项活动 i1,i2,ik

则存在最优解A,就是所选的这k项的集合 A = {i1,i2,…ik}

意思就是,要证明我们所用的贪心算法,每一步都是最优解

设变量

设共有n项活动待安排,活动的开始时间分别是s1,s2,…sn

活动的结束时间分别是 f1,f2,…fn

将这n个活动按照最早结束时间排好序,也就是f1,f2,…fn从小到大排好序

排好序的n个活动设为S = {a1,a2,…an}

这个活动安排题目的最优解,即安排的活动数最多的子序列,设为A

一共需要选择x次得到最优解

数学归纳法

当算法执行到第k步的话,表示当前已经选择了k项活动.

当k=1时,我们需要证明最早结束的活动a1,一定被选中

此时任取最优解B(其实就刚刚选了一个活动),如果B中第一个活动不是a1,那么可以用a1,替换B中的第一个活动
替换过后的B’也是当前的最优解.所以无论第一个活动在不在B里,都能找到最优解A使得第一个活动一定在最优解A里

假设算法执行k次时,得到的是最优解

A = {i1,i2,…ik}

算法还没有执行完毕,A中剩下活动选自集合S’ = { i | i 属于S ,si>=fk}
S’中的元素肯定输入原集合,但是因为此时已经安排好了k个活动,如果要接着选,那么被选到的活动的开始时间一定是大于等于第k个活动的结束时间

假设从S’中选择的活动集合是C,那么按照我们的贪心算法C是S’的最优解
整体的最优解A = {i1,i2,…ik} U C

如果C不是最优解,D是最优解,说明D中包含的活动比的多
那么整体的最优解应该是 A = {i1,i2,…ik} U D
与A = {i1,i2,…ik} U C是最优解相矛盾

到此
我们在假设贪心算法执行k次,所选择的集合是最优解的条件下
推出 A = {i1,i2,…ik} U C

那么当算法执行k+1次时,即从S’中再选出一个元素 i(k+1) 时,根据上面的假设,我们知道 i(k+1) 一定是S’中开始时间最早的活动,而且C是S’的最优解,
所以{i1,i2,…ik,i(k+1)} U { C- i(k+1) }也是原问题的最优解.

总结

k=1时,一定会选最早开始的活动
假设 k = k时成立
也就是最优解 A = {i1,i2,…ik} U C
那么有 k = k + 1时
A = {i1,i2,…ik,i(k+1)} U { C- i(k+1) }
所以对于这道活动安排题,贪心算法所取得的就是最优解

这东西不像数学公式那样,有板有眼的
我自己理解的也不是很透彻
应该多分析分析就好了吧,毕竟小菜鸡不能变成北京烤鸭

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值