贪心算法求解最优服务次序问题

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验名称:贪心算法实例编程

求解最优服务次序问题

1、实验目的:

1)理解贪心算法的概念

2)掌握贪心算法的基本要素

3)掌握设计贪心算法的一般步骤

4)针对具体问题,能应用贪心算法设计有效算法

5)用C++实现算法,并且分析算法的效率

2、实验设备及材料:

硬件设备:PC机

机器配置:双核cpu频率2.2GHz,内存2G

操作系统:Windows 7

开发工具:VC++6.0

3、实验内容:

①问题描述

设有n个顾客同时等待一项服务。顾客i需要的服务时间为t i,1≤i≤n。

应如何安排n个顾客的服务次序才能使平均等待时间达到最小?平均等待时间是n恶搞顾客等待服务时间的总和除以n。

②编程任务

对于给定的n个顾客需要的服务时间,计算最优服务次序。

③样例

例如,现在有5个顾客,他们需要的服务时间分别为:56,12,5,99,33。

那么,按照所需服务时间从小到大排序为:5,12,33,56,99。排序后的顾客等待服务完成的时间为:5,17,50,106,205;和为:383;平均等待时间为:76.6。

4、实验方法步骤及注意事项:

①实验步骤

a、分析问题,确定最优的贪心选择;

b、针对贪心选择过程进行算法设计;

c、举例验证算法的正确性;

d、上机调试算法。

②解题思路

1)求解最优服务次序问题的贪心策略为:先为所需服务时间最短的顾客服务。

2)使用贪心算法求解最优服务次序问题的算法,用C++语言描述。

①.最优值:(贪心算法)

text(int n,int x[],int s[])//s[]为保存每个顾客等待时间的数组

{

int i;

int sum=0;

for(i=0;i

{if(i>0){

s[i]=x[i]+s[i-1];

sum+=s[i];}

else {

s[i]=x[i];

sum+=s[i];

}

}

return sum/n;

}

②.最优解:(快速排序)

void QuickSort(int e[], int first, int end)

{

int i=first,j=end,key=e[first];

while(i

{

while(i=key)

j--;

e[i]=e[j];

while(i

i++;

e[j]=e[i];

}

e[i]=key;

if(first

QuickSort(e,first,i-1);

if(end>i+1)

QuickSort(e,i+1,end); }

实验数据:

根据对上述贪心算法数据的分析,解决此问题还可以用其他方法。

{

int i,sum=0;//总等待时间

for(i=0;i

sum+=x[i]*(n-i);

return sum/n;

}

源程序:(以下采用文件输入,如需手动输入请将fin改为cin。并去掉主函数中cout的注释) #include

#include

text(int n,int x[],int s[])

{

int i;

int sum=0;

for(i=0;i

{

if(i>0)

{

s[i]=x[i]+s[i-1];

sum+=s[i];

}

else {

s[i]=x[i];

sum+=s[i];

}

}

return sum/n;

}

text2(int n,int x[])

{

int i,sum=0;

for(i=0;i

sum+=x[i]*(n-i);

return sum/n;

}

void QuickSort(int e[], int first, int end)

{

int i=first,j=end,key=e[first];

while(i

{

while(i=key)

j--;

e[i]=e[j];

while(i

i++;

e[j]=e[i];

}

e[i]=key;

if(first

QuickSort(e,first,i-1);

if(end>i+1)

QuickSort(e,i+1,end);

}

/*void sort(int n,int x[])//冒泡排序

{

int i,j,c;

for(j=0;j

{

for(i=0;i<(n-1);i++)

{

if(x[i]>x[i+1])

{

c=x[i];

x[i]=x[i+1];

x[i+1]=c;}

}

}

cout<<"等待时间从小到大排序:";

for(i=0;i

cout<

}*/

void main()

{

ifstream fin("D:\\c++\\wait1.in");

int x[1000];

int s[1000]={0};

int n;

//cout<<"请输入顾客的个数:";

fin>>n;

//cout<<"请输入顾客的等待时间:";

for(int i=0;i

fin>>x[i];

QuickSort(x,0,n-1);//快速排序

cout<<"等待时间从小到大排序:";

for(i=0;i

cout<

//sort(n,x);//冒泡排序

cout<<'\n'<<"最小平均等待时间为:"<

//cout<<'\n'<<"最小平均等待时间为:"<

相关文档
最新文档