当前位置:文档之家› 实验二 贪心算法-最少活动会场安排问题

实验二 贪心算法-最少活动会场安排问题

中原工学院计算机学院
实验报告
实验项目名称实验二、最少活动会场安排问题课程名称算法设计与分析
学生姓名梁斐燕
学生学号************
所在班级网络14卓越
学科专业网络工程
任课教师吴志刚
完成日期2016年月日
实验二最少活动会场安排问题
一、实验目的
1.掌握贪心算法的基本概念和两个基本要素
2.熟练掌握贪心算法解决问题的基本步骤。

3.学会利用贪心算法解决实际问题。

二、实验内容
•问题描述:
•题目一:假设要在足够多的会场里安排一批活动,并希望使用尽可能少的会场。

设计一个有效的贪心算法来进行安排,试编程实现。

•题目二:一辆汽车加满油后,可行使n千米。

旅途中有若干个加油站。

若要使沿途加油次数最少,设计一个有效算法,指出应在哪些加油站停靠加油。

•数据输入:个人设定,由键盘输入。

•要求:
–上述题目任选一做。

上机前,完成程序代码的编写
–独立完成实验及实验报告
三、实验步骤
㈠、数据结构与核心算法的设计描述
提示:题目一:参考教材活动安排问题;有关队列操作参考数据结构。

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;
}
}
㈡、函数调用及主函数设计
㈢程序调试及运行结果分析
㈣实验总结
在做本实验之前,自己看了课本上所列举的贪心法解活动安排问题的代码,代码很简单,很容易理解,于是就按课本的代码实现。

通过几个测试用例测试发现结果不对,后来发现自己忘了进行贪心法的一个前提条件,事先没有按各个活动结束时间对所有活动进行非递减排序,所以才会导致结果错误。

经过修正后,自己真正理解了贪心法解活动安排问题的原理。

四、主要算法流程图及程序清单
1、主要算法流程图:
快速排序产生中间数贪心算法实现活动安排主函数调用
2、程序清单
(程序过长,可附主要部分)
#include"stdafx.h"
#include<stdio.h>
#include<stdlib.h>
#include<algorithm>
#define N 50
#define TURE 1
#define FALSE 0
int s[N];/*开始时间*/
int f[N];/*结束时间*/
int A[N];/*用A存储所有的*/
void GreedySelector(int n, int *s, int *f, int *A);
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]<x);
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 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 main()
{
int n = 0, i;
while (n <= 0 || n>50)
{
printf("\n");
printf("请输入活动的个数:");
scanf_s("%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_s("%d", &s[i]);
printf("f[%d]=", i, i);
scanf_s("%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 ", i);
} printf("\n");
system("pause");
return 0;
} //快速排序
//产生中间数
//贪心算法实现活动安排
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;
}
}。

相关主题