贪心算法解活动安排实验报告(共4页).doc
精选优质文档-倾情为你奉上实验3 贪心算法解活动安排问题一 、实验要求1 要求按贪心法求解问题;2 要求读文本文件输入活动安排时间区间数据;3 要求显示结果。二 、实验仪器和软件平台仪器 :带usb接口微机软件平台:WIN-XP + VC+6.0三 、源程序#include "stdafx.h"#include<stdio.h>#include<stdlib.h>#include<algorithm>#define N 50#define TURE 1#define FALSE 0int sN;/*开始时间*/int fN;/*结束时间*/int AN;/*用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请分别输入开始时间si和结束时间fi:nn");for(i=1;i<=n;i+)printf("s%d=",i,i); scanf("%d",&si);printf("f%d=",i,i); scanf("%d",&fi);printf("n"); QuickSort(s,f,1,n); /按结束时间非减序排列 printf("按结束时间非减序排列如下:n"); /*输出排序结果*/printf("n 序号t开始时间 结束时间n");printf("-n");for(i=1;i<=n;i+) printf(" %dt %dt %dn",i,si,fi);printf("-n");GreedySelector(n,s,f,A);/贪心算法实现活动安排printf("安排的活动序号依次为:");for(i=1;i<=n;i+)if(Ai) printf("n%d %d->%d",i,si,fi); printf("n"); system("pause"); return 0;/快速排序void QuickSort(int *b,int *a,int p,int r) int q; if(p<r)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=ap;y=bp; while(1)while(a+i<x);while(a-j>x);if(i>=j)break;else k=ai;ai=aj;aj=k;m=bi;bi=bj;bj=m;ap=aj;bp=bj;aj=x;bj=y;return j;/贪心算法实现活动安排void GreedySelector(int n,int *s,int *f,int *A) /用集合A来存储所选择的活动 A1=TURE; /默认从第一次活动开始执行 int j=1; /j记录最近一次加入到A中的活动 for(int i=2;i<=n;i+) /fj为当前集合A中所有活动的最大结束时间 /活动i的开始时间不早于最近加入到集合A中的j的时间fj if(si>=fj) Ai=TURE; /当Ai=TURE时,活动i在集合A中 j=i; else Ai=FALSE; 四 、运行结果五 、实验小结贪心算法总是做出在当前看来最好的选择,也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择。活动安排问题就是要在所给的活动集合中选出最大的相容活动子集合。该问题要求高效地安排一系列争用某一公共资源的活动。贪心算法提供了一个简单、漂亮的方法使得尽可能多的活动能兼容地使用公共资源。专心-专注-专业