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