贪心算法实验报告
- 格式:doc
- 大小:70.00 KB
- 文档页数:9
贪心算法
实验目的与要求:
(1)掌握贪心算法的基本思想;
(2)能使用贪心算法求解一些相关问题;
实验设备(环境):VC++6.0
实验内容:
(1)将课本上的多机调度问题用JAVA或者C语言进行编程实现,并分析该算法的时间复杂性。
(2)用贪心算法编程实现汽车加油问题。
题目描述
一辆汽车加满油后可行驶n公里。旅途中有若干个加油站。设计一个有效算法,指出应在哪些加油站停靠加油,使沿途加油次数最少。对于给定的n和k个加油站位置,计算最少加油次数。
输入
输入数据的第一行有2个正整数n和k(n≤4000,k≤1000),表示汽车加满油后可行驶n公里,且旅途中有k个加油站。接下来的1 行中,有k+1 个整数,表示第k个加油站与第k-1个加油站之间的距离。第0个加油站表示出发地,汽车已加满油。第k+1个加油站表示目的地。
输出
将计算出的最少加油次数输出。如果无法到达目的地,则输出”No Solution!”。
示例输入
7 7
1 2 3 4 5 1 6 6
示例输出
4
(3)用贪心算法编程实现最大整数问题。
题目描述
。
输入
n
N个数
输出
连成的多位数
示例输入
3
13,312,343
示例输出设有n个正整数,将它们连接成一排,组成一个最大的多位整数
34331213
实验步骤、实验结果及分析:
(1) 实验代码:
#include
#define N 20
typedef struct node{
int id ,time;//作业所需时间
}jobnode;
typedef struct Node{
int id ,avail;//id机器编号、avail每次作业的初始时间
}manode;
manode machine[N];
jobnode job[N];
/*找出下一个作业执行机器*/
manode *Find_min(manode a[],int m){
manode *temp=&a[0];
for(int i=1;i
if(a[i].avail avail)
temp=&a[i];
}
return temp;
}
/*对作业时间由大到小进行排序*/
void sort(jobnode t[],int n){
jobnode temp;
for(int i=0;i
for(int j=n-1;j
if (job[j].time >job[j-1].time ){
temp=job[j];
job[j]=job[j-1];
job[j-1]=temp;
}}}}
void main(){
int n,m,temp,i;
manode* ma;
printf("输入作业数目\n");
scanf("%d",&n);
printf("输入相应的作业所需处理的时间:\n");
for(i=0;i
scanf("%d",&job[i].time );
job[i].id =i+1;
}
printf("输入机器数目:\n");
scanf("%d",&m);
for(i=0;i
machine[i].id =i+1;
machine[i].avail =0;
}
putchar('\n');
if(n<=m){
printf("为每个作业分配一台机器,可完成任务!\n");
return;
}
sort(job,n);
for(i=0;i
ma=Find_min(machine,m);
printf("将机器:M%d从%d------>%d的时间段分配给作业:%d\n",ma->id ,ma->avail ,ma->avail +job[i].time ,job[i].id );
ma->avail +=job[i].time ;
}
temp=machine[0].avail ;
for(i=1;i
if(machine[i].avail >temp)
temp=machine[i].avail ;
}
putchar('\n');
printf("该批次作业完成所需时间为:%d\n",temp);
while(1);
}
实验结果截图:
(2)实验代码:加油问题代码
#include
void greedy(int d[],int n,int k){
int num=0;
int i=0;
int s=0;
for(i=0;i
if(d[i]>n){
printf("No Solution\n");
return;
}
}
for(i=0,s=0;i<=k;i++){
if(s
s+=d[i];
else if(s>n){
n=s-d[i];
num++;
}
}
printf("%d\n",num);
}
void main(){
int i,n,k;
int d[1000];
printf("请输入汽车可行驶公里数:");
scanf("%d",&n);
printf("请输入加油站的个数:");
scanf("%d",&k);
for(i=0;i<=k;i++)
scanf("%d",&d[i]);
greedy(d,n,k);
}
实验结果截图:
(3)实验代码:设有n个正整数,将它们连接成一排,组成一个最大的多位整数
#include
int Comparelnt(int a,int b)
{
int a1=a,b1=b,la=10,lb=10;
while(a/la)
{la*=10;
}
while(b/lb)
{
lb*=10;
}
return (a*lb+b)-(b*la+a);
}
int main()
{
int i,j,n;
int data[20],temp;
while(1)
{
scanf("%d",&n);
if(n<=0||n>20) break;
for(i=0;i
{
scanf("%d",&data[i]);
}
for(j=0;j
for(i=0;i
{
if(Comparelnt(data[i],data[i+1])<0)
{
temp=data[i+1];
data[i+1]=data[i];
data[i]=temp;
}
}
for(i=0;i
{
printf("%d",data[i]);
}
printf("\n");
}
return 0;
}
实验结果截图:
实验总结(包括过程总结、心得体会及实验改进意见等):
指导教师评语:
1、完成所有规定的实验内容,实验步骤正确,结果正确;
2、完成绝大部分规定的实验内容,实验步骤正确,结果正确;
3、完成大部分规定的实验内容,实验步骤正确,结果正确;
4、基本完成规定的实验内容,实验步骤基本正确,所完成的结果基本正确;
5、未能很好地完成规定的实验内容或实验步骤不正确或结果不正确。
6、其它:
评定等级:A(优秀) B(良好) C(中等) D(及格) E(不及格)
成绩评定
教师签字
年 月 日
备注:
注:1、报告内的项目或设置,可根据实际情况加以补充和调整
2、教师批改学生实验报告应在学生提交实验报告10日内