综合性、设计性实验报告姓名唐艳学号200908001124专业计算机科学与技术班级2009级班实验课程名称算法设计与分析指导教师及职称吕兰兰讲师开课学期2011至2012学年上学期上课时间2011年10月18日湖南科技学院教务处编印一、实验设计方案实验名称:贪心算法实例编程实验时间:2011-11-08小组合作:是○否●小组成员:无1、实验目的:1)理解贪心算法的概念2)掌握贪心算法的基本要素3)掌握设计贪心算法的一般步骤4)针对具体问题,能应用贪心算法设计有效算法5)用C++实现算法,并且分析算法的效率2、实验设备及材料:(注意:请自行填写,按实际情况写,各位同学的实验报告应有所区别)硬件设备:PC机一台机器配置:良好操作系统:windows7开发工具:VC++6.03、实验内容:①问题描述一辆汽车加满油后可行驶n公里。旅途中有若干个加油站。设计一个有效算法,指出应在哪些加油站停靠加油,使沿途加油次数最少。并说明算法能产生一个最优解。②编程任务对于给定的n和k个加油站位置,编程计算最少加油次数。③样例例如,现在汽车加满油之后可跑7公里,途中共有7个加油站,各个加油站之间的距离为1公里、2公里、3公里、4公里、5公里、1公里、6公里、6公里。那么,汽车可在____第三,第四,第五,第七个加油站______(哪几个加油站)加油,使沿途加油次数最少,只需加油___4_____次。4、实验方法步骤及注意事项:(注意:此部分为本实验的关键部分,请自行填写,不得雷同!)①实验步骤(请参考教材自行总结归纳之后再认真填写)[问题分析]由于汽车是由始向终点方向开的,我们最大的麻烦就是不知道在哪个加油站加油可以使我们既可以到达终点又可以使我们加油次数最少。提出问题是解决的开始.为了着手解决遇到的困难,取得最优方案。我们可以假设不到万不得已我们不加油,即除非我们油箱里的油不足以开到下一个加油站,我们才加一次油。在局部找到一个最优的解。却每加一次油我们可以看作是一个新的起点,用相同的方法进行下去。最终将各个阶段的最优解合并为原问题的解得到我们原问题的求解。加油站贪心算法设计(C++):#includestdio.h#includeiostream.h#includefstream.hintgreed(intn,intk,int*a){intsum=0,count=0;ifstreamfin;fin.open(D:\\input.txt);ofstreamfout(D:\\output.txt);for(inti=1;i=k+1;i++){sum+=a[i];if(sumn){count++;sum=0;i--;fouti,;}}returncount;}intmain(){intn,k,i,number;inta[100];ifstreamfin;fin.open(D:\\input.txt);ofstreamfout(D:\\output.txt);finn;fink;for(i=1;i=k+1;i++)fina[i];if(a[i]n)printf(NoSoluthion!);else{number=greed(n,k,a);foutnumber;}}②解题思路(注意:以下部分仅为提示,请自行填写;若表格不够,可自行拉伸。)1)确定求解汽车加油问题的贪心选择策略。2)给出使用贪心算法求解汽车加油问题的算法,用C++语言描述。要求:求解汽车加油问题时,不仅要求出所需的最小加油次数(即最优值),而且还要求出应在哪些加油站加油(即最优解)。3)证明上述算法的正确性。(可选)需证明:汽车加油问题始终存在以贪心选择开始的最优解,以及汽车加油问题具有最优子结构性质。贪心算法正确性证明:贪心选择性质所谓贪心选择性质是指所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到。对于一个具体的问题,要确定它是否具有贪心性质,我们必须证明每一步所作的贪心选择最终导致问题的一个整体最优解。根据贪心选择,在该题中,为使加油次数最少就会选择距离加满油得点远一些的加油站去加油,因此,加油次数最少满足贪心选择性质。最优子结构性质:当一个问题大的最优解包含着它的子问题的最优解时,称该问题具有最优子结构性质。由于(b[1],b[2],……b[n])是这段路程加油次数最少的一个满足贪心选择性质的最优解,则易知若在第一个加油站加油时,b[1]=1,则(b[2],b[3],……b[n])是从a[2]到a[n]这段路程上加油次数最少且这段路程上的加油站个数为(a[2],a[3],……a[n])的最优解,再者,每个过程从加油开始行驶到再次加油满足贪心且每一次加油后相当于与起点具有相同的条件,每个过程都是相同且独立,也就是说加油次数最少具有最优子结构性质。5.实验数据处理方法:①数据输入由文件input.txt给出输入数据。第一行有2个正整数n和k,表示汽车加满油后可行驶n公里,且旅途中有k个加油站。接下来的1行中,有k+1个整数,表示第k个加油站与第k-1个加油站之间的距离。第0个加油站表示出发地,汽车已加满油。第k+1个加油站表示目的地。②结果输出将编程计算出的最少加油次数以及应在哪些加油站加油输出到文件output.txt。如果无法到达目的地,则输出”NoSolution”。二、实验报告6.参考文献:《计算机算法设计与分析(第3版)》王晓东著电子工业出版社《算法设计与实验题解》王晓东著电子工业出版社指导老师对实验设计方案的意见:指导老师签名:吕兰兰2011年11月10日1、实验目的、设备与材料、实验内容、实验方法步骤见实验设计方案2、实验现象、数据及结果(请自行填写真实结果)序号输入文件(input.txt)输出文件(output.txt)0.771234516641.370863320837726596702.6303746439477459811601542769615451655016286091174454935232544180885455275859927333.181465494615151577396324597734488251453597941631002557355561885440771538667591356965675453776994194185、实验总结1)、本次实验成败之处及其原因分析:注:从技术角度来分析实验的成功或失败,分析实验过程中出现了哪些问题,程序出现了什么错误,出现错误的具体原因是什么,以及是如何解决的。本次实验基本成功。只是最后输出加油的次数的数据覆盖了之前写入output文件中的在第1次在哪个加油站加油的数据。不知道应该在文件打开的语句中修改,使它可以在已经存在的文件中追加数据,而不是覆盖。3、对实验现象、数据及观察结果的分析与讨论:(对输入数据和相应输出结果按照你所设计的算法进行分析,举1~2个例子即可。要求分析出一个输入的最优解。)例:输入:78135154167输出:54、结论:(包括:使用的算法设计方法是否正确,是否也可以用其他方法解决,算法效率如何?程序的编译是否通过,程序的输出结果是否正确等)该实验使用的算法基本正确,程序编译通过。程序结果正确。时间复杂度为O(n)。2)、本实验的关键环节及改进措施:①做好本实验需要把握的关键环节:在greed函数中,判断sumn后,i的次数要减1。因为在距离大于可行驶的距离之前就应该之前的加油站加油了。(如实填写,忌文不对题)②若重做本实验,为实现预期效果,仪器操作和实验步骤应如何改善:我认为此贪心算法不需要再改进,够贪心了。(如实填写,忌文不对题)3)、对实验的自我评价:对文件的输入输出的使用还没完全掌握。(注:自己的体会、感想和收获等)指导老师评语及得分:签名:吕兰兰2011年11月15日