贪心算法解活动安排实验报告

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

实验 3 贪心算法解活动安

排问题

一、实验要求

1.要求按贪心法求解问题;

2.要求读文本文件输入活动安排时间区间数据;

3.要求显示结果。

二、实验仪器和软件平台

仪器:带 usb 接口微机

软件平台: WIN-XP + VC++6.0

三、源程序

#include "stdafx.h"

#include

#include

#include

#define N 50

#define TURE 1

#define FALSE 0

int s[N];/* 开始时间*/

int f[N];/* 结束时间*/

int A[N];/* 用 A 存储所有的*/

int Partition(int *b,int *a,int p,int r);

void QuickSort(int *b,int *a,int p,int r);

void GreedySelector(int n,int *s,int *f,int *A);

int main()

{

int n=0,i;

while(n<=0||n>50)

{

printf("\n");

printf(" 请输入活动的个数,n=");

scanf("%d",&n);

if(n<=0) printf(" 请输入大于零的数!");

else if(n>50) printf(" 请输入小于50 的数!");

}

printf("\n 请分别输入开始时间s[i] 和结束时间

f[i]:\n\n");

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

{

printf("s[%d]=",i,i);

scanf("%d",&s[i]);

printf("f[%d]=",i,i);

scanf("%d",&f[i]);

printf("\n");

}

QuickSort(s,f,1,n); // 按结束时间非减序排列

printf(" 按结束时间非减序排列如下:\n"); /* 输出排

序结果*/

printf("\n 序号\t 开始时间结束时间\n");

printf(" -------------- \n");

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

printf(" %d\t %d\t %d\n",i,s[i],f[i]);

printf(" -------------- \n");

GreedySelector(n,s,f,A);// 贪心算法实现活动安排

printf(" 安排的活动序号依次为:"); for(i=1;i<=n;i++) {

if(A[i])

printf("\n%d %d-->%d",i,s[i],f[i]);

}

printf("\n");

system("pause");

return 0;

}

// 快速排序

void QuickSort(int *b,int *a,int p,int r)

{

int q;

if(p

q=Partition(b,a,p,r);

QuickSort(b,a,p,q-

1);/* QuickSort(b,a,q+1,r);/*

}

}

// 产生中间数

int Partition(int *b,int *a,int p,int r)

{

int k,m,y,i=p,j=r+1;

int x=a[p];y=b[p];

while(1)

{

while(a[++i]

while(a[--j]>x);

if(i>=j)

break;

else

{

k=a[i];a[i]=a[j];a[j]=k;

m=b[i];b[i]=b[j];b[ j]=m;

a[p]=a[j];

对左半段排序 */

对右半段排序 */

b[p]=b[j];

a[j]=x;

b[j]=y;

return j;

}

// 贪心算法实现活动安排

void GreedySelector(int n,int *s,int *f,int *A)

{

// 用集合 A 来存储所选择的活动

A[1]=TURE; // 默认从第一次活动开始执行

int j=1; //j 记录最近一次加入到 A 中的活动

for(int i=2;i<=n;i++)

{

//f[j] 为当前集合 A 中所有活动的最大结束时间// 活动i 的开始时间不早于最近加入到集合 A 中的j 的时间f[j] if(s[i]>=f[j])

{

A[i]=TURE; // 当A[i]=TURE 时,活动i 在集合 A 中

j=i;

else

A[i]=FALSE;

四、运行结果

五、实验小结

贪心算法总是做出在当前看来最好的选择,也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择。活动安排问题就是要在所给的活动集合中选出最大的相容活动子集合。该问题要求高效地安排一系列争用某一公共资源的活动。贪心算法提供了一个简单、漂亮的方法使得尽可能多的活动能兼容地使用公共资源。

相关文档
最新文档