(C/C++)区间调度问题的解决及输出:动态规划、贪心算法(递归、递推)

这篇博客介绍了如何使用动态规划和贪心算法解决区间调度问题,旨在找出最大兼容的活动子集。动态规划解决方案通过定义二维数组降低复杂度至O(n^3),而贪心算法则通过选择最早结束的任务,以O(n)复杂度达成目标。文章提供了递归和迭代两种贪心算法实现。
摘要由CSDN通过智能技术生成

给定n个活动,其中的每个活动ai包含一个起始时间si与结束时间fi。设计与实现算法从n个活动中找出一个最大的相互兼容的活动子集S。
要求:分别设计动态规划与贪心算法求解该问题。其中,对贪心算法分别给出递归与迭代两个版本的实现。

思路

动态规划

动态规划的思路则对此问题来说较为复杂,定义Sij为在i任务结束之后,j任务开始之间所包含的任务的子集。定义两个虚拟任务ai、an+1,则问题对应了S0,n+1的解。Sij的元素数量则对应了任务的数量。通过递归方程可知复杂度为O(n3),可通过设定另一个二维数组以输出元素。
递归方程

贪心算法

贪心算法的思路很简单,非空子集Sij,若am结束的时间最早,则有:
贪心准则:am一定属于Sij的某个最优解且Sim为空。
贪心准则的证明:
Aijj为Sij最优解,另其中的任务按照结束时间递增排序,令ak是Aij的第一个结束的任务,如果ak=am,则证明成立。否则我们将ak用a

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值