贪心算法分阶段工作,在每一个阶段,可以认为所做的决定是最好的,而不考虑将来的后果,这就意味着选择的是某个局部最优。当算法终止时,我们希望通过每次局部的最优最终得到全局最优。
节目表安排问题:比如某个学校举办元旦晚会,共有n个节目,假设每个节目开始时间start和结束时间end是已知的。由于时间的限制,晚会的整体时间是有限的,假设为m_time,那么怎样在总时间限制下尽量安排最多的节目。这就可以采用贪心算法,每次选择结束比较早的节目,这样给后面的节目留下更多的时间,可以安排更多的节目。但选择的节目前后要相容,即后一个节目开始时间一定要大于前一个节目结束时间。
greedy.h
#pragma once
#include<iostream>
#include<vector>
#include<string>
using namespace std;
template<typename Comparable>
struct Time
{
string name; //节目名字
Comparable start;//开始时间
Comparable end;//结束时间
bool flag; //是否安排标志
int w; //安排在第几个
};
template<typename Comparable>
class Greedy
{
public:
Greedy();
Greedy(Comparable t);
void insert(string name,Comparable start,Comparable end);//把所有节目放在vector中
void sort();//按结束时间最少把活动重新排序
void arrange();//对活动进行安排
void find(string name); //查找某个节目看其节目安排情况
void show(); //输出安排节目的整体表
private:
vector<Time<Comparable> > sche;//保存活动信息
vector<Time<Comparable> > destsche;//保存已安排的活动
Comparable m_time; //资源允许利用总共的时间
int count; //活动的总数
int k; //安排活动的总数
};
greedy.cpp
#include "stdafx.h"
#include"greedy.h"
#include<iostream>
#include<vector>
using namespace std;
template<typename Comparable>
Greedy<Comparable>::Greedy(Comparable t)
{
m_time=t;
count=0;
k=1;
}
template<typename Comparable>
void Greedy<Comparable>::insert(string name,Comparable start,Comparable end)
{
++count;
Time<Comparable> time;
time.name=name;
time.start=start;
time.end=end;
time.flag=false;
time.w=0;
sche.push_back(time);
}
template<typename Comparable>
void Greedy<Comparable>::sort()//冒泡排序,每次比较相邻的元素,若前一个比后一个大则交换
{
Time<Comparable>tem;
for(int i=1;i<count;i++)
for(int j=0;j<count-i;j++)
{
if(sche[j].end>sche[j+1].end)
{
tem.name=sche[j].name;
sche[j].name=sche[j+1].name;
sche[j+1].name=tem.name;
tem.start=sche[j].start;
sche[j].start=sche[j+1].start;
sche[j+1].start=tem.start;
tem.end=sche[j].end;
sche[j].end=sche[j+1].end;
sche[j+1].end=tem.end;
}
}
}
template<typename Comparable>
void Greedy<Comparable>::arrange()
{
sort();
int j=0;
sche[0].flag=true;
sche[0].w=k;
destsche.push_back(sche[0]);
for(int i=1;i<count;i++)
{
if((sche[i].start>=destsche[j].end)&&(sche[i].end<=m_time))
{
k=k+1;
sche[i].flag=true;
sche[i].w=k;
j=j+1;
destsche.push_back(sche[i]);
}
}
}
template<typename Comparable>
void Greedy<Comparable>::find(string name)
{
for(int i=0;i<k;i++)
{
if(destsche[i].name==name)
{
cout<<"name:"<<destsche[i].name<<endl;
cout<<"start:"<<destsche[i].start<<endl;
cout<<"end:"<<destsche[i].end<<endl;
cout<<"flag:"<<destsche[i].flag<<endl;
cout<<"order:"<<destsche[i].w<<endl;
}
else if(i>=k-1)
cout<<"NO this program"<<endl;
}
}
template<typename Comparable>
void Greedy<Comparable>::show()
{
cout<<"安排节目总数:"<<k<<endl;
for(int i=0;i<k;i++)
{
cout<<"name:"<<destsche[i].name<<endl;
cout<<"start:"<<destsche[i].start<<endl;
cout<<"end:"<<destsche[i].end<<endl;
cout<<"flag:"<<destsche[i].flag<<endl;
cout<<"order:"<<destsche[i].w<<endl;
}
}
Agorithm-greedy1.cpp
//主要是实现作业调度问题
#include "stdafx.h"
#include "greedy.h"
#include "greedy.cpp"
#include<iostream>
#include<vector>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
Greedy<int>g(12);
g.insert("f",5,9);
g.insert("a",1,4);
g.insert("j",2,13);
g.insert("b",3,5);
g.insert("h",8,11);
g.insert("c",0,6);
g.insert("k",12,14);
g.insert("g",6,10);
g.insert("d",5,7);
g.insert("i",8,12);
g.insert("e",3,8);
g.arrange();
g.find("g");//查找某个节目是否在安排列表中
g.show();//输出安排的节目表
return 0;
}