算法导论2 贪心算法 活动选择问题

本文探讨了在给定一系列按结束时间排序的活动时如何通过自顶向下的递归方法和贪心算法来找到最大数量的非重叠活动组合。介绍了两种算法的基本思路,并解释了为什么贪心算法中选择最早结束的活动作为解决方案的一部分是合理的。

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

  1. 问题
    1. 有n个活动S(a1,a2,a3,...,an)要在一个场地举行; 举行活动时各个活动的时间范围内不能有重叠部分,问最多能举行多少个活动(最大活动数)?
    2. 活动集体S是按每个活动的结束时间排序的;
  2. 自顶向下的递归方法
    1. 设f(i,j)为活动 ai 到 aj 的之间(不包含ai,aj)最大活动数;ak 为活动 ai 到 aj 的任意一个活动;则 f(i,j) = f(i,k) + 1 + f(k,j)
    2. 当 i>=j;则不能举行任何活动
  3. 贪心算法
    1. 可举行的第一个活动am一定是 f(i,j) 最大活动数 集合 之一
      1.  设 (ax,ay,...,az) 是任意一个最大活动数集合且不包含第一个活动 am;但由于am是最早结束的;则am的结束时间 早于ax结束时间; 与ay及之后所有的活动没有重叠部分;所以完全可以用am替换ax,得到 最大活动数相同的集合
    2. 选择第一个活动am作为f(i,j)之一时;只剩一个子问题 f(m,j)
  4. 代码
    1. src/samples/algorith/C161GreedyActivitySelector.ts · Bob/LayaAir - Gitee.com
  5. 运行结果

     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值