您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 经营企划 > 算法分析与设计实验报告
计算机算法设计与分析实验报告目录实验一..............................................................1[实验题目]......................................................1[问题描述]......................................................1[算法设计]......................................................1[算法分析]......................................................1[源代码]........................................................1[运行结果]......................................................2实验二..............................................................2[实验题目]......................................................2[问题描述]......................................................2[算法设计]......................................................2[算法分析]......................................................2[源代码]........................................................2[运行结果]......................................................4实验三..............................................................5[实验题目]......................................................5[问题描述]......................................................5[算法设计]......................................................5[算法分析]......................................................5[源代码]........................................................5[运行结果]......................................................61实验一[实验题目]2-7集合划分问题[问题描述]n个元素的集合{1,2,…,n}可以划分为若干非空子集。例如,当n=4时,集合{1,2,3,4}可以划分为15个不同的非空子集。[算法设计]给定正整数n,计算出n个元素的集合{1,2,…,n}可以划分为多少个不同的非空子集。[算法分析]本算法实现采用分治法思想,F(n,m)=F(n-1,m-1)+m*F(n-1,m)。假设将m个元素分解到n个集合中,首先考虑将(m–(n-1))个元素分到第一个集合中,将余下的(n-1)个元素分别分配到余下的(n-1)个集合中,然后再考虑将(m–(n-2))个元素分配到第一个集合中,将余下的(n-2)个元素分别分配到余下的(n-1)集合中,依此类推,直到后面的有一个集合中的元素个数比第一个集合中的元素个数多为止。[源代码]#includeiostreamusingnamespacestd;intcompute_bell(introw,intposition){if(row==1)return1;if(row==2&&position==1)return1;else{if(position==1)returncompute_bell(row-1,row-1);elsereturncompute_bell(row,position-1)+compute_bell(row-1,position-1);}}intmain(){intn=0;intm;coutpleaseinputanumber.endl;cinn;m=compute_bell(n,n);couttheresuleismendl;}2[运行结果]实验二[实验题目]3-1独立任务最优调度问题[问题描述]用2台处理机A和B处理n个作业。设第i个作业交给机器A处理时需要时间ai,若由机器B来处理,则需要时间bi。由于各作业的特点和机器的性能关系,很可能对于某些i,有ai≥bi,而对于某些j,j≠i,有ajbj。既不能将一个作业分开由2台机器处理,也没有一台机器能同时处理2个作业。设计一个动态规划算法,使得这2台机器处理完这n个作业的时间最短(从任何一台机器开工到最后一台机器停工的总时间)。研究一个实例:(a1,a2,a3,a4,a5,a6)=(2,5,7,10,5,2);(b1,b2,b3,b4,b5,b6)=(3,8,4,11,3,4)。[算法设计]对于给定的2台处理机A和B处理n个作业,找出一个最优调度方案,使2台机器处理完这n个作业的时间最短。[算法分析]当完成k个作业,设机器A花费了x时间,机器B所花费时间的最小值肯定是x的一个函数,设F[k][x]表示机器B所花费时间的最小值。则F[k][x]=Min{F[k-1][x]+b[k],F[k-1][x-a[k]]};其中F[k-1][x]+b[k]表示第k个作业由机器B来处理(完成k-1个作业时机器A花费的时间仍是x),F[k-1][x-a[k]]表示第k个作业由机器A处理(完成k-1个作业时机器A花费的时间是x-a[k])。那么单个点对较大值Max(x,F[k][x]),表示此时(即机器A花费x时间的情况下)所需要的总时间。而机器A花费的时间x是变化的,即x=0,1,2……x(max),由此构成了点对较大值序列。要求整体时间最短,取这些点对较大值序列中最小的即可。[源代码]#includeiostream#includefstream#includeiomanipusingnamespacestd;constintSIZE=50;constintMAXINT=999;intmain(){3while(1){intN,a[SIZE],b[SIZE],SumA[SIZE],SumB[SIZE];inttempSumA,tempSumB,MinSum;inti=0,j,k;tempSumA=tempSumB=0;intdata;intoriData[SIZE];ifstreamifile;ifile.open(input.txt);if(ifile.eof()){cerrFailtoopenthefileinput.txtendl;return1;}while(ifiledata){oriData[i++]=data;}N=(int)oriData[0];for(i=1;i=N;i++){a[i]=oriData[i];tempSumA+=a[i];SumA[i]=tempSumA;}for(i=1,j=N+1;j=2*N;j++,i++){b[i]=oriData[j];tempSumB+=b[i];SumB[i]=tempSumB;}coutInput.txtData:endl;coutoriData[0]endl;for(i=1;i=2*N;){coutoriData[i];i++;coutoriData[i]endl;i++;}4coutendl;ifile.close();MinSum=(tempSumBtempSumA)?tempSumA:tempSumB;int*MaxTime=newint[MinSum+1];int**F=newint*[N+1];for(i=0;iN+1;i++)F[i]=newint[MinSum+1];SumB[0]=0;for(i=0;i=N;i++){F[i][0]=SumB[i];for(j=1;j=MinSum;j++)F[i][j]=0;}inttemp;for(k=1;k=N;k++){temp=(SumA[k]SumB[k])?SumB[k]:SumA[k];for(i=1;i=temp;i++){if(i=a[k])F[k][i]=(F[k-1][i]+b[k]F[k-1][i-a[k]])?F[k-1][i]+b[k]:F[k-1][i-a[k]];elseF[k][i]=F[k-1][i]+b[k];}}temp=MAXINT;for(i=0;i=MinSum;i++){MaxTime[i]=(iF[N][i])?i:F[N][i];if(tempMaxTime[i])temp=MaxTime[i];}ofstreamofile;ofile.open(output.txt);ofiletempendl;ofile.close();coutthebesttimeistempendl;while(1);}}[运行结果]5实验三[实验题目]4-9汽车加油问题[问题描述]一辆汽车加满油后可行驶nkm。旅途中有若干加油站。设计一个有效算法,指出应在那些加油站停靠加油,使沿途加油次数最少。并证明算法能产生一个最优解。[算法设计]对于给定的n和k个加油站位置,计算最少加油次数。[算法分析]将一辆汽车在出发地加满油,每次加满可行驶nkm,利用相邻加油站之间距离d[]是否可行驶的距离,并利用贪心算法计算最优解。[源代码]#includestdio.hvoidGreedy(intd[],intn,intk){intsum=0;inti=0;intj=0;for(i=0;ik;i++){if(d[i]n){printf(NoSolution\n);return;}}for(i=0,j=0;ik;i++){j+=d[i];if(jn){sum++;j=d[i];}}printf(minrefueltime:%d\n,sum);}intmain(){inti,n,k;intd[100];6printf(inputthelength:\n);scanf(%d,&n);printf(inputthenumberofstations:\n);scanf(%d,&k);printf(inputthelengthoftwostation:\n);for(i=0;ik+1;i++)scanf(%d,&d[i]);Greedy(d,n,k+1);return0;}[运行结果]实验四[实验题目]最短加法链问题[问题描述]最优求幂问题:给定一个正整数n和一个实数x,如何用最少的乘法次数计算出xn。例如,可以用6次乘法逐步计算x23如下:x,x2,x3,x5,x10,x20,x23。可以证明,计算x23的幂序列中各幂次组成正整数n的一个加法链:1=a0a1a2…ar=nar=aj+ak,k=jI,i=1,2,…,r上述最优求幂问题相应于正整数n的最短加法链问题,即求n的一个加法链使其长度r达到最小。正整数n的最短加法链长度记为l(n)。数据输入:由文件input.txt给出输入数据。第1行有1个正整数n。结果输出:将计算的最短加法链长度l(n)和相应的最短加法链输出到文
本文标题:算法分析与设计实验报告
链接地址:https://www.777doc.com/doc-3572814 .html