贪心算法----活动时间安排
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验二:贪心算法
【实验目的】
深入理解贪心法的算法思想,应用贪心算法解决实际的算法问题。
【实验性质】
验证性实验。
【实验要求】
有n个活动的集合A={1,2,…,n},其中每个活动都要求使用同一资源,如演讲会场等,而在同一时间内只有一个活动能使用这一资源。求解安排尽量多项活动在该场地进行,即求A的最大相容子集。
【程序代码】
# include <>
void input(int a[ ][3]); //输入活动时间
void sort (int a[ ][3]); //排序
void output1 (int a[ ][3]); //排序的结果输出
int greed (int a[ ][3], int arr[][50][3], int m); //判断记录被选中的活动时间
void output2 (int a[][50][3], int y,int m); //输出最大的的活动时间int yi=0;
int n;
int main ()
{
int array[50][3];
int arr[50][50][3]={0};
int z, y, m, b[12]={0};
printf ("活动总数量n(n<50) \n\n");
scanf ("%d", &n);
input (array);
sort (array);
printf ("\n");
output1 (array);
printf ("\n");
for (m=0; m b[m] = greed (array, arr, m); y = 0; for (m=0; m if (y < b[m]) { y = b[m]; z = m; } printf ("安排活动时间的最大相容子集:\n"); output2 (arr, y,z); return 0; } void input(int a[ ][3]) { int i, j; for (i=0; i { a[i][0]=i+1; printf ("请输入第%d个活动的开始时间和结束时间:", i+1); for(j=1; j<3; j++) scanf ("%d", &a[i][j]); } } void sort (int a[ ][3]) { int i, j, k, t; for (i=0; i for (j=0; j for (k=0; k<3; k++) if (a[j][2] > a[j+1][2]) { t = a[j][k]; a[j][k] = a[j+1][k]; a[j+1][k] = t; } } void output1 (int a[ ][3]) { int i, j; printf ("按结束时间的升序排列如下:\n"); for (i=0; i { printf ("原来序号%d的开始时间和结束时间:", a[i][0]); for (j=1; j<3; j++) printf (" %d", a[i][j]); printf ("\n"); } } int greed (int a[ ][3], int arr[][50][3], int m) { int i, j, k, y=1; k = a[m][2];// for (i=0; i<3; i++) arr[yi][0][i] = a[m][i];// for (i=m; i { if (k <= a[i][1]) { k = a[i][2]; for (j=0; j<3; j++) arr[yi][y][j] = a[i][j]; y++; } } yi++; return y; } void output2 (int a[][50][3], int y,int m) { int i, j; for (i=0; i { printf ("选中了原来序号为第%d活动,他的开始结束时间分别为:", a[m][i][0]); for (j=1; j<3; j++) { printf ("%d ", a[m][i][j] ); } printf ("\n"); } } 法二 #include <> #define active_num 11 //活动数 #define true 1 //记录被选的活动#define false 0 //未被选择的活动int greedySelector(int s[],int f[],int b[]) // 算法 { b[0] = true; int j = 0; int i = 1; int count = 1; for(i = 1;i <=active_num; i++ ) { if(s[i] > f[j]) { b[i] = true; j = i; count++; } else b[i] = false; } printf("active number is %d\n",count); for(i=0;i { if(b[i] == 1) printf("%d ",i+1); }