问题描述
问题来自算法导论16.1。
问题来自算法导论16.1。
几个相互竞争的活动进行调度,他们要求以独占的方式使用某一公共资源。调度的目标是找出一个最大的相互兼容活动集合。
思想:总是选择剩余活动中具有最早结束时间的活动。
/*****************************************************************************
Copyright: 2012, USTC
File name: main.cpp
Description:Arrange activities by greedy method.
Author:Silang Quan
Version: 1.0
Date: 2012.12.3
*****************************************************************************/
#include<iostream>
#include<vector>
using namespace std;
//Iteration Method assume a[1] is the first activity meet the need.
int GreedySelect(int *s,int *f,int length,int *a)
{
int i,j=2;
a[1]=1;
i=1;
for(int m=2;m<=length;m++)
{
if(s[m]>=f[i])
{
a[j++]=m;
i=m;
}
}
return j;
}
//Recursion method
void GreedySelect2(int *s,int *f,int i,int j,vector<int>& result)// const int started[], const int finished[],vector<int>& result, int i,int j)
{
if( i >= j ) return;
int l;
for( l = i+1; l < j; ++l )
{
if( s[l] >= f[i] )
{
result.push_back(l);
break;
}
}
GreedySelect2(s,f,l,j,result);
}
int main()
{
int s[12]={0,1,3,0,5,3,5,6,8,8,2,12};
int f[12]={0,4,5,6,7,8,9,10,11,12,13,14};
//test1
/*
int a[13];
int i=GreedySelect(s,f,11,a);
for(int j=1;j<i;j++)
{
cout<<a[j]<<" ";
}
cout<<endl;
*/
//test2
vector<int> result;
GreedySelect2(s,f,0,12,result);
for(vector<int>::iterator iter=result.begin();iter!=result.end();++iter)
{
cout<<*iter<<" ";
}
cout<<endl;
}
参考:
算法导论,第二版,机械工业出版社
算法导论-贪心算法-http://blog.csdn.net/liuzhanchen1987/article/details/7854826