1、 Gray码序列的后4个元素(23=8),分别为:011,111,101,001是n=2时Gray码四个元素反向后加1,n=2时Gray码四个元素:即: 可以看出,Gray码可以用分治策略,递归实现,2n的Gray码可以用2n-1的Gray码构成。 算法描述: void Gray( type a,int n) char a; if (n=1) a0=0;a1=1; if (n1) Gray(a,n-1); int k=2n-1-1; /Gray码的个数,因为数组下标从0开始 int i=k; for (int x=k;x=0;x-) char y=ax; ax=y+0; ai+1=y+1; i
2、+; 3-7 给定由n个英文单词组成的一段文章,设由n 个单词组成的一段文章可以表示为 A1:n,它的“漂亮打印”方案记为B1:n,构成该最优解的最小空格数(最优值)记为m1n(1) 分析最优解的结构:A1:n的最优解B1:n,必然在第k个单词处断开,那么A1:k是“漂亮打印”,并且Ak+1:n也是“漂亮打印”。故m1n最小时有m1n=m1k+mk+1n ,m1k是A1:k的最小值,mk+1n是Ak+1:n的最小值。因此,原问题的最优解包含其子问题的最优解,具有最优子结构性质。(2) 建立递归关系:第一行,row=1,最漂亮的打印字符数 最小空格数 第二行,row=2,最漂亮的打印字符数最小空
3、格数那么,设:sum=i1+k2+in+n 为文章中字符的总长度,其中i1,i2,in分别为n个单词的长度,n为单词之间的空格数。 M是一行可以输出的字符数 该文章可能输出的行数约为:sum/M+1 (由于最后一行除外,故可能需处理的行数为sum/M行。第sum/M行时,row=sum/M最小空格数 1. 当i=j时,Ai:i=Ai,mij=0,表示一个单词,没有空格。2. 当ij时,利用最优子结构性质计算mij若Ai:j的最优解在Ak和Ak+1处断开,i=kj,则mij=minmik+mk+1j,此时,k只有j-i中可能,k是使mij达到最小的那个位置。从而mij可以递归地定义为:mij=
4、/上面两个式子mij给出了最优值,即Ai:j的最小空格数若将对应于mij的断开位置k记为sij,在计算出最优值mij后,可递归地由sij构造出相应的最优解(3) 计算最优值算法: void f(int n, int *m, int *s, int sum, int M) for(int i=1;i=n;i+) mij=0; for(int row=1;row=sum/M;row+) i=1; for (int r=2;rr+) j=i+r-1; mij=row*M-j+row-(i1+i2+ik) if (mij0) break; sij=j; for (int k=i+1;kj);k+) t
5、=mik+mk+1j; if (tmij) mij=t;sij=k; ;x=j-1;(4) 构造最优解算法描述:void T(int *B, int *s, int x) y=1; do by=s1x; x=by;y=y+1; while (x1) do printf(“%d,”,by); y-; while (y0) 4-26 求极差M=max-min解:该问题采用贪心选择算法解决。算法思想:求max的步骤:(1)对黑板上的n个正数从小到大排序(2)取最小的两个数,进行a*b+1运算,将结果插入数列,再从小到大排序。(3)重复步骤(2),直到黑板上剩一个数为止,该数为最大值max。求min的
6、步骤:(1)对黑板上的n个正数从大到小排序(2)取最大的两个数,进行a*b+1运算,将结果插入数列,再从大到小排序。(3)重复步骤(2),直到黑板上剩一个数为止,该数为最大值min。Void max-min(int n,int max,int min, type *x,type *y) MinHeapMinHeapNodex(1000); MaxHeapMaxHeapNodey(1000); While (true) MinHeapNodex; MaxHeapNodey; a=x.DeleteMin(x); b=x.DeleteMin(x); Max=a*b+1 x.insert(max);
7、c=y.DeleteMin(y); d=y.DeleteMin(y); Min=c*d+1 y.insert(min); catch(outofBounds) break; M=a-c5-10 最小重量机该问题用回溯法求解。1 问题的解空间:部件:n个 1=I=n, 供应商:m个 1= j=mwij:是从供应商j处构得的部件I的重量。Cij:是从供应商j处构得的部件I的价格。当(C11+C12+Cnm)C时,求最小的(W11+W12+Wnm)假设n=4 m=2 时,该问题的解空间树如下:该树为n层的m叉树。2 回溯法的基本思想:按深度优先的方式搜索整个解空间树。3 求约束函数和限界函数(1)
8、约束函数:若大于总价格C,则该结点不可能有解,可剪去以这个结点为根的子树。Constraint(c) :计算(C11+C12+Cnm)0 ) if ( ccbestc) bestc=c; if ( bestcc ) if ( cwbestw ) bestw=cw; return; for ( j=1 ; j=m; j+) if ( cc+cIjc ) cc+=cIj; weight-cost(I+1); cc- =cIj; int n, /部件数 m, /供应商树type *w, /是从供应商j处构得的部件I的重量。type *c, /是从供应商j处构得的部件I的价格。 c, /总价格 cc, /当前总价格 cw, /当前总重量 bestc, /当前最优价格 bestw; /当前最优重量main()n=4; m=2; c=1000; cc=0; cw=0; bestc=0; bestw=32767; weight-cost(1);
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1