算法设计与分析实验报告Word文档格式.docx
《算法设计与分析实验报告Word文档格式.docx》由会员分享,可在线阅读,更多相关《算法设计与分析实验报告Word文档格式.docx(14页珍藏版)》请在冰豆网上搜索。
空间复杂性分析:
O(n)
六、实验体会
通过写递归与分治策略实验,更加清楚的知道它的运行机理,分治法解题的一般步骤:
(1)分解,将要解决的问题划分成若干规模较小的同类问题;
(2)求解,当子问题划分得足够小时,用较简单的方法解决;
(3)合并,按原问题的要求,将子问题的解逐层合并构成原问题的解。
做实验重在动手动脑,还是要多写写实验,才是硬道理。
七、附录:
(源代码)
#include"
stdio.h"
#defineElemTypeint
intcount(ElemTypea[],inti,intj,ElemTypex)
{
intk=0,mid;
//k用来计数,记录数组中x出现的次数
if(i==j)
{
if(a[i]==x)k++;
returnk;
}
else
mid=(i+j)/2;
k+=count(a,i,mid,x);
k+=count(a,mid+1,j,x);
returnk;
}
ElemTypeMaxitem(ElemTypea[],intn)
ElemTypemax=a[n-1],j;
if(n==1)
max=a[n-1];
returnmax;
j=Maxitem(a,n-1);
if(j>
max)max=j;
voidmain(void)
ElemTypea[]={1,5,2,7,3,7,4,8,9,5,4,544,2,4,123};
ElemTypeb;
ElemTypex;
intn;
b=Maxitem(a,15);
printf("
数组的最大元素为%d\n"
b);
输入想要计数的数组元素:
\n"
);
scanf("
%d"
&
x);
n=count(a,0,14,x);
%d在数组中出现的次数为%d次\n"
x,n);
实验二动态规划——求解最优问题
一、实验目的
1.加深学生对动态规划算法设计方法的基本思想、基本步骤、基本方法的理解与掌握;
2.提高学生利用课堂所学知识解决实际问题的能力;
3.提高学生综合应用所学知识解决实际问题的能力。
二.实验内容
根据实验目的要求和实验条件,由学生运用所学知识,自行选择最优问题,自己设计算法,自行编程实现、自行对实验结果进行分析,自行完成实验项目报告的撰写等。
在教师的指导下,最大限度发挥学生资助学习的积极性,为后续专业课的学习打下坚实基础。
三.实验要求
(1)用动态规划思想求解最优问题;
(2)再选择自己熟悉的程序设计语言实现所有算法;
(3)分析所设计的算法的时间/空间复杂性。
四.实验过程设计(算法设计过程)
实验3.3。
先在a[],b[]数组中选a[0]和b[0]开始,然后分别计算在以a[0]和b[0]开始的总的时间,再比较哪个最短。
五.实验结果分析
六.实验体会
始终觉得用代码写着比用笔直接计算要难点,不过代码解决的事一类问题,只需要输数据就可以。
所以还是代码好,不过要有好的逻辑思维和方法,才能写出好的
七.附录:
#include"
iostream.h"
string.h"
voidmain()
voidsf(inta[],intb[],intn);
inta[100],b[100],n,i;
请输入需要完成的作业数量:
"
n);
请输入A组机器完成作业对应的时间:
for(i=0;
i<
n;
i++)scanf("
a[i]);
请输入B组机器完成作业对应的时间:
b[i]);
f(a,b,n);
voidf(inta[],intb[],intn)
intmax(inta,intb);
inti,j,d,low,high,k,A,B,v[100];
i++)
for(j=0;
j<
j++)
{
if(a[i]<
a[j])
{
d=a[i];
a[i]=a[j];
a[j]=d;
d=b[i];
b[i]=b[j];
b[j]=d;
}
}
low=i;
high=i;
while(a[i]==a[i+1])
i++;
high=i;
if(low!
=high)
for(k=low;
k<
=high;
k++)
for(j=k;
{
if(b[k]<
b[j])
{
d=b[k];
b[k]=b[j];
b[j]=d;
}
}
A=0;
B=0;
j=0;
while(j<
=i)
A=A+a[j];
j++;
n)
B=B+b[j];
v[i]=max(A,B);
i=1;
d=v[0];
while(i<
if(v[i]<
d)
d=v[i];
最短作业时间为:
%d\n"
d);
intmax(inta,intb)
if(a>
b)
returna;
else{
returnb;
实验三贪心算法——“0/1背包”及“有限期作业调度”
1.进一步理解算法设计的基本步骤及各步的主要内容、基本要求
2.加深对贪婪法算法设计方法的理解与应用
3.掌握将算法转化为计算机上机程序的方法
4.培养学生应用所学知识解决实际问题的能力。
(1)给定n种物品和一个背包。
物品I的重量是wi,其价值为pi,背包的容量为M。
应如何选择装入背包的物品(每件物品可以全装也可以只装一部分),使得装入背包中物品的总价值最大?
(2)给定n个作业j1,j2,…,jn。
对每个作业ji,有一个与之联系的限期di>
0和收益pi≥0,di,pi均为整数,1≤I≤n。
对作业ji,只有在限期di内完成,才能得到收益pi。
假定只有一台处理机为这批服务业服务,处理机每次只能处理一个作业,并且完成一作业需一个单位时间。
所谓一个可行解,是这批作业的一个子集J,J中每一作业均能在限期di内完成。
调度的总收益是子集J中各作业收益之和。
具有最大收益的的可行解和为最优解。
如何求其最优解?
(1)设计用贪婪法求解“背包问题”及“带有限期的计算机作业调度问题”的算法;
(2)上机实现所设计的算法;
后面人的等到时间等于前面人的服务时间,要总的等待时间最短,就要前面的服务时间最短,就需要先让服务时间段的人先进行服务。
1.先按原来的顺序服务时间服务,得到一个等待时间
2.升序排列后,得到一个等待时间
五.结果分析
这是总的实验思路。
贪心算法就是要尽可能的提高效率,得到想要的效益。
七.附录(源代码)
main()
inti,j,n,a[100],d=0,k=0;
请输入顾客的总人数:
依次输入每个顾客的服务时间:
d=0;
for(intj=0;
i;
d=d+a[j];
//第j个人的等待时间
k=k+d;
//总的等待时间
此时等待的总时间为:
k);
for(intj=i;
if(a[i]>
按升序排列后的数组为:
i++)printf("
a[i]);
k=0;
\n此时等待的总时间为:
实验四回溯法——“N皇后”问题
1.掌握能用回溯法求解的问题应满足的条件;
2.加深对回溯法算法设计方法的理解与应用;
3.锻炼学生对程序跟踪调试能力;
4.通过本次实验的练习培养学生应用所学知识解决实际问题的能力。
由N2个方块排成N行N列的正方形,称为N元棋盘,在N元棋盘上放置N个皇后,如果某两个皇后位于N元棋盘的同一行或同一列或同一斜线(斜率为±
1)上,则称它们在互相攻击,试设计算法找出使N个皇后互不攻击的所有布局。
(1)用回溯法算法设计方法求解N元皇后问题
(2)找出N皇后问题的互不攻击的所有解
(3)皇后数N由键盘动态输入
(4)上机实现所设计的算法;
(5)分析所设计的算法的时间/空间复杂性。
(1)分析N皇后问题的约束条件,并将其显示化,选择存储结构建立相应的数学模型;
(2)根据所建立的数学模型,设计求解该