贪心算法----活动时间安排

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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);

}

相关文档
最新文档