还剩17页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
平时作业、给定下述二分搜索算法,请判断算法的对的性,指出错误算法的产生原因1a intBinarySearchType a[],const Typefex,int1,int r{while r=1{int m=l+r/2;if x==a[m]return m;if xa[m]r=m-1;else1=m+1;}return-1;答对的b intBinarySearchType a[],const Typex,int1,int r{while r〉=1{int m=1+r/2;if x==a[m]return m;if xa[m]r=m+1;else1=m-1;if a[i].ba[j].b swapa[i],a[j];if a[i].b=a[j].b{ifa[i].fa[j].f swapa[i],a[j];;〃使用的会场数初始化int int sum=1int n;a[l].no=sum;〈=fori=2;i k;i++{forn=1;ni;n++{ifa[n].no!=0a[n].f=a[i].b{a[i].no=a[n].no;已经安排过的活动就不再比较a[n].no=0;//J break;}ifn==isum+=l;a[i].no=sum;〈”输出至少会场数〃〈〈〈cout\n sumendl;systempause;}、最优分解问题设是一种正整数现规定将分解为若干个互不相似的自然数的和,6n nJ J使得这些自然数的乘积最大设计一种算法,得到最优分解方案分析:我们懂得假如二常数,则越小,越大a+b|a-b|a*b贪心方略将提成从开始日勺持续自然数的和假如最终剩余一种数,将此数在n2后项优先的方式下均匀地分给前面各项I答void dicompint n,int[]aint k=1;if n3{a[l]=0;return;}if n5{a[k]=1;a[++k]=n-1;return;}a[l]=2;n-=2;while na[k]{k++;a[k]=a[k-1]+1;n-=a[k];if n==a[k]{a[k]++;n-;}for int i=0;in;i++a[k-i]++;、子集和问题设的,々,…,是个正整数日勺集合,是一种正整数那么与否存在7S={z}n c日勺一种子集使得子集中元素之和等于即S S1,c,£x=c答#includestdio.hint n,c;int a
[100];〃寄存目前选择的状况int current
[100];寄存最终选择区子集合,表达包括,反之即不包括int best
[100];//J best[i]=l,判断有无满足欧状况int d=l;//I与否已经选出子集和int d2=0;//void Backint m,int count;int main{int ij;scanfH%d%d”,n,c;fori=0;in;i++{scanfH%d,a|i];currentli]=best[i]=0;BackO,O;ifd printfnnosolution\nH;输出满足状况勺子集和forj=0;jn;j++//HifbestU]==lprintfH%d\t\tn,a[j];}void Backintm,int count{int k;ifmnreturn;ifcount==c{有满足的子集和d=0;//ifd2return0;fork=0;k=m;k++best[k]=current[k];d2=l;return0;}else{选入子集和current[m]=l;//count+=a[m];Backm+1,count;〃不选入子集和cuirent|m]=O;count=count-a|m];Backm+1,count;
8、设序列Z={Z]/2,,zj是序歹U X=/〃,}和Y={y,乂,…,%}的J最长公共子序列请阐明最长公共子序列具有最优子构造性质a设记录序列,玉、和匕={如为,,匕}口勺最长公共子序列的长度由最长公共子b Xi={%/2,序列问题的最优子构造性质建立子问题最优值的递归关系I写出寻找最长公共子序列的算法C答最长公共子序列问题具有最优子构造性质若二则且是和的最长公共子序列1xm yn,zk=xm=yn,Z[k-1]Y[n-1]I、若且,则是和的最长公共子序列2xm!=yn,zk!=xm ZX[m-1]Y、若且,则是和的最长公共子序列由性质导出子问题日勺递归构造3xm!=yn,zk!=yn ZY[n-1]X当=时,皿i=0,j c[i=0当时,叩皿=i,j0xi=yi+1当时,i,j0xi!=yi c[i][j]=max{c[i][j-l],c[i-l][j]}public classLSC{private int[][]c,b;private intm,n;private char[]A,B;public LSCchar[]A,char[]B{this.A=A;this.B=B;m=A.length;n=B.length;c=new int[m+l][n+l];b=new int[m+l]|n+l];forint i=O;ivn+l;i++{c[O][i]=O;forint j=O;jm+l;j++{cU][O]=O;public LSC{}public intLSCLength{forint j=l;jn+l;j++{/**假如和是相等日勺话*/A[i-1]B[j-1]ifA[i-l]=B[j-l]{c[i]UJ=c[i-l]U-l]+l;b[i]U]=V;/**状况1*/else ifc[i-l][j]=c[i][j-l]{c[i]Ul=c[i.l][j];b[i][j]=jr;/**状况2*/else{c[i]U]=c[i]U.l];b[i]U]=^;}return c[m][n];}public voidprintint i,int j{ifi=0||j=0{return;}else ifb[i][j]==,O,{printi-lj-l;System.out.printA[i-1];皿Jelse ifb[i=T{printi-lj;}else{printij-l;public intLSCLength2int i,int j{ifi0||j0{return0;}else{ifA[i]==BUD{return1+LSCLength2i-1j-1;else{int a1=LSCLength2ij-1;int a2=LSCLength2i-1,j;return ala2al:a2;}public staticvoid mainString|]args{「char[]A={g,f,d asda;C};char[]B={gVc,;f;a;tVOVc,;c,};LSC lsc=new LSCA,B;System.out.printlnlsc.LSCLength27,7;
9、记矩阵连乘积=ij确定计算A[l:n]日勺最优计算次序,使得所o需数乘的次数至少、阐明矩阵连乘计算次序问题日勺最优解包括着其子问题时最优解,即最优子构造性1质、该问题具有子问题日勺重叠性质
2、阐明采用动态规划措施可以处理该问题
3、设计该算法,分析算法的复杂性4答计算的最优次序所包括日勺计算矩阵子链和的次序也是最优A[i:k]A[k+l:j]的设计算所需要的至少数乘次数则原问题的最优值为当时,I A[i:j],IWiWjWn,I m[i,j],m[l,n]i=j A[i:无需计算,因此,j]=Ai,m[i,j]=0,i=l,2,--,n当〈时,运用最优子构造性质计算设的最优次序在和之间断开,则i jm[i,j].A[i:j]Ak Ak+1777[i,j]=777[i,k]+777[k+l,+fDi-1/3kPj其中日勺维数为日勺位置只有种可能,…,其中使计算量最小日勺那Ai pi-IXpj kj-i{i,i+1,jT},个位置为最优解,数乘次数最小值为问题的最优值可以递归地定义为:m[i,j]J0i=j.im[_i,j]=\min{m[i,k]+m[k+/,y]+/Di lfD kPj]ij j将最优值对应的断开位置记为则可递归欧由构造出对应的最优m[i j]s[i j],J s[i j]J解对于不一样的有序对对应于不一样勺子问题因此,不一样子问题IWiWjWn I(i,j)H日勺个数最多只有return-1;答错误当查找欧元素在中间元素日勺左边时,右指针应该为位if xa[m]r=m+1;I mT置,修改成if xa[m]r=m+1;else1=m+1c intBinarySearchType a[],const Typefex,int1,int r{while r1{intm=1+r/2;if x=a[m]return m;if xa[m]r=m-1;else1=m+1;return-1;}答错误耍考虑到数组只有一种元素的状况因此应该是while r1r=l;、空间子数组环卫算法设是一种维数组,是一种非负整201n k1W kWn-1数试设计一种算法将子数组与换位规定算法在最坏状况下耗时且只a[0:k-l]a[k+l:n-1]0n,用区辅助空间01J+勿=0/72由此可见,在递归计算时,许多子问题被反复计算多次这也是该问题可用动态规划算法求解的又一明显特性用动态规划算法解此问题,可根据其递归式以自底向上的方式进行计算在计算过程中,保留已处理的子问题答案每个子问题只计算一次,而在背面需要时只要简朴查一下,从而防止大量欧反复计算最终得到I多项式时间的算法已经记录了构造最优解所需股全部信息从I matrixChainI s[l][n]可知,计算的|最优加括号方式为计算A[l:n]A[1:s[l][n]]A[s[l][n]+1:n]A[1:]的最优加括号方式为s[l][n]A[1:s[l][s[l][n]]]A[s l][s[l][n]]+1:s[l][n]]、考虑分数背包问题,定义如下给出个大小为,价值为的物品,并10n SI,S2,…,Sn V1,V2,…,Vn I设背包容量为要找到非负实数使和玉匕在约束£天下C,X1,X2,…,Xn,f J/=1i=l最大写出求解问题时贪心算法,估计算法口勺时间复杂性答从问题的某一初始解出发;能朝给定总目标前进一步求出可行解的I whiledo一种解元素;由所有解元素组合成问题的一种可行解;从问题日勺某一种初始解出发逐渐迫近给定时目标,以尽量快的地求得更好的解当到达某算法中的某一步不能再继续前进时,算法停止#include stdio.h#define total10floatp[total],w[total],t[total];void greedy_knaPsackint xjntc{int note,i;float max;whilel{note=0;max=0;fori=0;ix;i++ifmaxp[i]/w[i]t[i]==0{max=p[i]/w[i];note=i;}ifw[note]c{t[note]=l;c-=w[note];}else{t[note]=c/w[note];请输入物break;}}}int main{int i=0n=0;float cu;printf9品总数不不小于与背包日勺容量%dtotal;whilel{scanfn%d%f\n,cu;ifntotal break;else printf物品总数超过范围,请重新输入;请输入每个物品的价值与重量}printf\n;fori=0;in;i++{scanfn%f%f\p[i],w[i];t[i]=O;}greedy_knaPsackn,cu;printf由贪心算法所得最优解是:\nn;fori=0;in;i++printfn%f n,t[i];return0;}时间复杂度分析算法中用到三个循环,故计算时间复杂度即此算法时时间复杂度为for On=n+n+n=3nOn=n答最简朴的措施就是循环次,将数组的末尾数字插入到之前n-k-1a a
[0]详细做法⑴首先开辟一种额外空间用于寄存每一次数组日勺末尾数据temp a2temp-a[n-l]将每个数据都依次向后移动一位赋值给3a[0:n-2]a[l:n-l]o4a
[0]-temp循环执行步次52-4n-k+1代价分析时间代价——即数量级;空间代价On-l*n-k+l
02201、定义给定一种自然数由开始依次产生半数集中的元素如下3n,n setn11n eset{n};在勺左边加上一种自然数,但该自然数不能超过近来添加日勺数的二分之一;2nH按此规则进行处理,直至不能再添加新的自然数为止3例如砥及=其中共有个元素s{6,16,26,126,36,136}6半数集问题对于给定日勺求半数集中元素的个数n,setn答半数集中元素个数的求解是个递归的过程设中的元素个数为则显然有递setn setnfn,归体现式汇即半数集元素个数fn=l+fi,i=l,
2.C#includestdio.h#includestdlib.h intmain{int n;int ij,s;int buf
[106];char*in=ninput.txt,,*out=,output.txtn;FILE*ip,*op;ifip=fopenin,Hrn==NULLreturn1;ifop=fbpenout,nwn==NULLretum2;fscanfip,”%d”,n;fcloseip;buf[l]=l;buf
[2]=2;buf
[3]=2;fori=4;i*2=n;i++{s=l;forj=l;j=i/2;j++{s+=buf[j];buf[i]=s;s=l;forj=l;j v=n/2;j++{s+=buf[j];}fprintfop,n%dM,s;fcloseop;/*systempause;*/return0;、设计一种算法,找出由个数构成的序列日勺最长单调递增子序列的长度4n答#includeiostream.h#define m10〃迅速排序void QuickSortintR[J,ints,int t{inti=sj=t;int tmp;ifst{tmp=R[s];whilei!=j{whilejiR[j|=tmp j—;R[i]=R[j];whileijR[i]=tmp i++;RUl=R[i];QuickSortR,s,i-l;QuickSortR,i+l,t;〃找出最长公共子序列void LCSLengthintx[],int y[],intn,int c[m][m],int b[m][m]{int ij;fori=0;in;i++{c
[0][i]=0;c[i]
[0]=0;fori=0;in;i++forj=0;jn;j++{ifx[i]==y[j]{c[i][j]=c[i-l][j-l]+l;b[i][j]=l;Jelse ifc[i-l][j]=c[i][j-l]{c[i]U]=c[i-l]U];皿b[i=2;}else{c[i]U]=c[i]U-l];b[i]U]=3;void LCSinti,int j,int*x,int b[m][m]{ifi0||j0return;ifb[i][j]==l{LCSi-l,j-l,x,b;cout«x[i]«n H;}else ifb[i][j]==2LCSi-l J,x,b;else LCSi,j-l,x,b;void main{intx[m],y[m],d;请输入元素个数”《coutv”endl;cin»d;请输入元素”coutvv”Vendl;forint i=0;id;i++{cin»x[i];y[i]=x[i];}int c[m][m]={0},b[m][m]={0};QuickSortx,0,d-1;LCSLengthx,y,d,c,b;最长单调递增子序列为〈coutv”Vendl;LCSd-l,d-l,x,b;、会场安排问题假设要在足够多的会场里安排一批活动,并但愿使用尽量少的会场设计5一种有效的贪心算法进行安排对于给定的个待安排欧活动,计算使用至少会场的个数I nI每个活动均有一种开始时间和结束时间,分别表达为⑴i b⑴,f答:#includeiostreamusing namespacestd;最大活动数ttdefine M50//struct Active{〃开始时间int b;〃结束时间int f;〃预安排会场号int no;a[M];〃两元素互换位置void swapActivea,Active b{Active t=a;a=b;b=t;!void main{int k,i,j;〈〃输入待安排活动数cout:,z«endl;cink;〈〃输入待安排活动的开始时间和结束时间〃输入活动时间cout:,z«endl;〃活动时间排序fori=l;i=k;i++{{forj=i;j=k;j++{。
个人认证
优秀文档
获得点赞 0