贪心算法-节目安排

     贪心算法分阶段工作,在每一个阶段,可以认为所做的决定是最好的,而不考虑将来的后果,这就意味着选择的是某个局部最优。当算法终止时,我们希望通过每次局部的最优最终得到全局最优。

     节目表安排问题:比如某个学校举办元旦晚会,共有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;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值