码迷,mamicode.com
首页 > 编程语言 > 详细

贪心算法—活动选择问题

时间:2015-06-01 22:41:45      阅读:195      评论:0      收藏:0      [点我收藏+]

标签:贪心算法   活动选择问题   

4.1 活动选择问题
1.问题的理解与描述
假定有n个需要使用同一个这样的资源的活动,每次只能有一个活动使用该资源。每一个活动有一个开始时间 si,一个完成时间 fi,其中0 ≤ si < fi < ∞。如果区间[si , fi)和[sj , fj)不相交,活动ai和aj是相容的(即如果si≥ fj 或 sj ≤ fi,ai和aj相容)。活动选择问题是选取一个由相容活动构成的最大集合。
输入:按完成时间排好序的活动开始时间数组s,完成时间数组 f。
输出:表示一个最大的相容活动组的向量{x1, x2, …, xn},其中

xi={01ii1,2,...,n

2.最优子结构
定义集合
Sij=akS:fisk<fksj,为表示整个问题,添加两个假想的活动a0和an+1并约定f0 = 0及sn+1 = ∞。于是S = S0 n+1,而i和j的取值范围为0 ≤ i,j ≤ n + 1。显然只要i≥ j,就有Sij =?。假定Sij的一个解包含活动ak,每一个都构成Sij中的活动的子集。设Aij是Sij的一个最优解,akAij。利用ak产生两个子问题: SikSkj,则Aij中Sik的解Aik和Skj的解Akj必对于: Sik和Skj也是最优的。
3.贪婪选择性
定理4-1
考虑任一非空子问题Sij,并设am为Sij中最早完成的一个活动:
fm=minfk:akSij

(1)活动am包含在Sij的一个最大相容活动子集合中。
(2)子问题Sim是空的,所以选择am将使得Smj成为仅有的非空子问题。
4.算法的伪代码描述

RECURSIVE-ACTIVITY-SELECTOR (s, f, i, j)
1 m ← i + 1
2 while m < j 且 sm < fi ?求Sij中的第一个活动 
3   do xm←0
4     m ← m + 1
5 if m < j
6   then xm←1
7       RECURSIVE-ACTIVITY-SELECTOR (s, f, m, j)

算法运行时间:Θ(n)

5 C++代码实现

贪心算法—活动选择问题

标签:贪心算法   活动选择问题   

原文地址:http://blog.csdn.net/u010177286/article/details/46315725

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!