关闭

[算法导论读书笔记]活动选择问题

标签: 活动算法读书iterator任务
1748人阅读 评论(0) 收藏 举报
分类:

问题定义:

    活动选择问题就是要选择出一个由相互兼容的问题组成的最大子集合。

活动编号:1    2    3    4    5    6    7        8        9        10        11  

开始时间:1    3    0    5    3    5    6        8        8        2         12 
完成时间:4    5    6    7    8    9   10       11      12     13       14

    对于上面这个例子来说,子集{3, 9, 11}由相互兼容的活动组成,然而他们不是最大的子集,子集{1, 4, 8, 11}更大。事实上{1, 4, 8, 11} 是一个最大的相互兼容的活动子集{2, 4, 9, 11}是另一个最大子集。

算法思想:

    活动的选择采用一种“贪婪的”选择方法,即:每次选择最早结束的活动加入到集合中,为后面的活动剩下的待调度任务留下尽可能多的机会,这就是传说中的贪心算法。

伪代码:


代码示例:

#include <iostream>
#include <vector>
using namespace std;

vector<int> v;
void GreddyActivitySelector(int s[], int f[], int n)
{
	int i, m;
	i = 0;//f[i] is the last time of actiom 
	v.push_back( i + 1);

	for( m = 1; m < n; m++)
	{
		if( s[m] >= f[i])
		{
			v.push_back( m + 1 );
			i = m;
		}
	}	
}
int main(int argc, char* argv[])
{
	int s[] = {1, 3, 0, 5, 3, 5, 6, 8, 8, 2, 12};
	int f[] = {4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14};
	GreddyActivitySelector(s, f, sizeof(s)/sizeof(s[0]));
	for(vector<int>::iterator i = v.begin(); i != v.end(); i++)
	{
		cout << "a"<< *i << "\t";
	}
	cout <<"\nv.size() = " << v.size() << endl;
	return 0;
}


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:737313次
    • 积分:6737
    • 等级:
    • 排名:第3707名
    • 原创:58篇
    • 转载:10篇
    • 译文:7篇
    • 评论:85条
    文章分类