实验名称:贪心算法实例编程
求解最优服务次序问题
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<n;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<j)
{
while(i<j && e[j]>=key)
j--;
e[i]=e[j];
while(i<j && e[i]<=key)
i++;
e[j]=e[i];
}
e[i]=key;
if(first<i-1)
QuickSort(e,first,i-1);
if(end>i+1)
QuickSort(e,i+1,end); }
实验数据:
根据对上述贪心算法数据的分析,解决此问题还可以用其他方法。
{
int i,sum=0;//总等待时间
for(i=0;i<n;i++)
sum+=x[i]*(n-i);
return sum/n;
}
源程序:(以下采用文件输入,如需手动输入请将fin改为cin。
并去掉主函数中cout的注释) #include<iostream.h>
#include<fstream.h>
text(int n,int x[],int s[])
{
int i;
int sum=0;
for(i=0;i<n;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<n;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<j)
{
while(i<j && e[j]>=key)
j--;
e[i]=e[j];
while(i<j && e[i]<=key)
i++;
e[j]=e[i];
}
e[i]=key;
if(first<i-1)
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<n;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<n;i++)
cout<<x[i]<<' ';
}*/
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<n;i++)
fin>>x[i];
QuickSort(x,0,n-1);//快速排序
cout<<"等待时间从小到大排序:";
for(i=0;i<n;i++)
cout<<x[i]<<' ';
//sort(n,x);//冒泡排序
cout<<'\n'<<"最小平均等待时间为:"<<text(n,x)<<endl;//算法1
//cout<<'\n'<<"最小平均等待时间为:"<<text2(n,x)<<endl;//算法2 }。