假设要用很多个教室对一组活动进行调度。我们希望使用尽可能少的教室来调度所有的活动。请给出一个有效的贪心算法,来确定哪一个活动应该使用哪一个教室。
(这个问题也被称为区间图着色)问题。我们可以作出一个区间图,其顶点为已知的活动,其边连接着不兼容的活动。为使任两个相邻结点的衍射均不同,所需的最少颜色数对应于找出调度给定的所有活动所需的最少教室数。
求解:
最有子结构:
//S为原问题所有活动的集合;
设R为原问题的最优解;现在去除任意一种颜色/×(设其所容纳的活动的集合为Sx)×/;那么其剩余的方案为子问题S-Sx的最优解;若不是着可设能找到颜色数更少的方案;那么这种方案加上最后一颜色所组成的方案比假设的最优解所用的方案数少;矛盾【1】
贪心策略:
//先将原问题的集合按开始时间排序(开始时间相同,按什么方式排序对最有解没有影响);【2】
//设A1为从S中安开始时间从左到有选取的兼容活动的结合;剩下的集合为S1=S-A1//(级从左到右遍历只要他与A1中的活动兼容就加入到A1中)
//以此为推Ai为从Si-1中从左到右选取的兼容子集合;(不妨设这样的划分把S分成了SUM个子集合)
每次从问题集合中选取A /×(A是集合中从左到右选取)×/ 为一种颜色;剩余的活动用其他颜色安排最优方案;他们的组合是原问题的一种最优方案;
归纳法证明:对于集合A1 其最优方案为:
1)A1
集合A1+A2其最优方案为:
1) A1
2) A2
设对于集合A1+A2+...Ak其最优方案为:
1)A1
2) A2
3) ...
K) AK;
则 当集合为A1+A2+...Ak+(Ak+1)时其最优方案为:
1)A1
2) A2
3) ...
K) Ak
K+1) Ak+1
因为A1+A2+Ak+(Ak+1)的方案的颜色数>=k+1;
证明:
选取Ai中最后一个活动设为ti(i=1...k+1);
则t1与t2、t3、...、tk+1不兼容;否则根据选取规则他们应该在A1中 (A1...Ak+1可以这样得到对原问题集合从左到右遍历,然后它与集合A1...Ak+1从上倒下匹配,成功就把他加入;这样第2个集合的最后一个活动就不与地一个集合的最后一个活动兼容;如果兼容它就可以应该在第一个集合中;以此类推)
以此类推ti不与其后的活动兼容;应此这些活动两两不兼容,他们不能放到同一个集合中;这样的活动由k+1个因此安排的方案数>=k+1
从而刚才的方案属于最优方案
这样就证明了贪心选择的可行性;
【1】 blog.csdn.net/jlr_6/article/details/5370936
【2】 Instructor_Manual for CLRS