请教:2011年11月软考软件设计师-下午试题(标准参考答案版)第4大题第1小题如何解答?【题目描述】试题四(共15分) 阅读下列说明和c代码,将应填入(n)处的字句写在答题纸的对应栏内。 【说明】 设某一机器由n个部件组成,每一个部件都可以从m个不同的供应商处购得。供应商j供应的部件i具有重量Wij和价格Cij。设计一个算法,求解总价格不超过上限cc的最小重量的机器组成。 采用回溯法来求解该问题: 首先定义解空间。解空间由长度为n的向量组成,其中每个分量取值来自集合{l,2,&helli

题目
请教:2011年11月软考软件设计师-下午试题(标准参考答案版)第4大题第1小题如何解答?

【题目描述】

试题四(共15分)

   阅读下列说明和c代码,将应填入(n)处的字句写在答题纸的对应栏内。

 【说明】

   设某一机器由n个部件组成,每一个部件都可以从m个不同的供应商处购得。供应商j供应的部件i具有重量Wij和价格Cij。设计一个算法,求解总价格不超过上限cc的最小重量的机器组成。

   采用回溯法来求解该问题:

   首先定义解空间。解空间由长度为n的向量组成,其中每个分量取值来自集合{l,2,…,m},将解空间用树形结构表示。

   接着从根结点开始,以深度优先的方式搜索整个解空间。从根结点开始,根结点成为活结点,同时也成为当前的扩展结点。向纵深方向考虑第一个部件从第一个供应商处购买,得到一个新结点。判断当前的机器价格(C11)是否超过上限(cc),重量(W11)是否比当前已知的解(最小重量)大,若是,应回溯至最近的一个活结点;若否,则该新结点成为活结点,同时也成为当前的扩展结点,根结点不再是扩展结点。继续向纵深方向考虑第二个部件从第一个供应商处购买,得到一个新结点。同样判断当前的机器价格(C11+C21)是否超过上限(cc),重量(W11+W21)是否比当前已知的解(最小重量)大。若是,应回溯至最近的一个活结点;若否,则该新结点成为活结点,同时也成为当前的扩展结点,原来的结点不再是扩展结点。以这种方式递归地在解空间中搜索,直到找到所要求的解或者解空间中已无活结点为止。

【C代码】

下面是该算法的C语言实现。

 (1)变量说明

 n:机器的部件数

 m:供应商数

 cc:价格上限

 w[][]:二维数组,w[i][j]表示第j个供应商供应的第i个部件的重量

 c[][]:二维数组,c[i][j]表示第j个供应商供应的第i个部件的价格

 best1W:满足价格上限约束条件的最小机器重量

 bestC:最小重量机器的价格

 bestX[].最优解,一维数组,bestX[i]表示第i个部件来自哪个供应商

 cw:搜索过程中机器的重量

 cp:搜索过程中机器的价格

 x[]:搜索过程中产生的解,x[i]表示第i个部件来自哪个供应商

 i:当前考虑的部件,从0到n-l

 j:循环变量

 (2)函数backtrack

   Int n=3;

   Int m=3;

 

   int cc=4:

   int w[3][3]={{1,2,3},{3,2,1},{2,2,2}};

   int c[3][3]={{1,2,3},{3,2,1},{2,2,2}};

   int bestW=8;

   int bestC=0;

   int bestX[3]={0,0,0};

   int cw=0;

   int cp=0;

   int x[3]={0,0,0};

 int backtrack(int i){

     int j=0;

     int found=0;

     if(i>n-1){/*得到问题解*/

        bestW= cw;

        bestC= cp;

        for(j=0;j<n;j++){

   (1)____;

   }

       return 1;

   }

   if(cp<=cc){/*有解*/

       found=1;

   }

   for(j=0; (2)____;j++){

      /*第i个部件从第j个供应商购买*/

   (3) ;

       cw=cw+w[i][j];

       cp=cp+c[i][i][j];

       if(cp<=cc && (4) {/*深度搜索,扩展当前结点*/

           if(backtrack(i+1)){found=1;}

       }

       /*回溯*/

        cw= cw -w[i][j];

   (5)   ;

   }

   return found;

 }

 

   从下列的2道试题(试题五和试题六)中任选1道解答。

如果解答的试题数超过1道,则题号小的1道解答有效。

 


相似考题
更多“请教:2011年11月软考软件设计师-下午试题(标准参考答案版)第4大题第1小题如何解答? 【题目描述】 试题四(共15分) 阅读下列说明和c代码,将应填入(n)处的字句写在答题纸的对应栏内。 【说明】 设某一机器由n个部件组成,每一个部件都可以从m个不同的供应商处购得。供应商j供应的部件i具有重量Wij和价格Cij。设计一个算法,求解总价格不超过上限cc的最小重量的机器组成。 采用回溯法来求解该问题: 首先定义解空间。解空间由长度为n的向量组成,其中每个”相关问题
  • 第1题:

    试题四(共15分)

    阅读下列说明和C代码,回答问题1至问题3,将解答写在答题纸的对应栏内。

    【说明】

    设有n个货物要装入若干个容量为C的集装箱以便运输,这n个货物的体积分别为{S1,S2,...,Sn},且有si≤C(1≤i≤ n)。为节省运输成本,用尽可能少的集装箱来装运这n个货物。

    下面分别采用最先适宜策略和最优适宜策略来求解该问题。

    最先适宜策略( firstfit)首先将所有的集装箱初始化为空,对于所有货物,按照所给的次序,每次将一个货物装入第一个能容纳它的集装箱中。

    最优适宜策略( bestfit)与最先适宜策略类似,不同的是,总是把货物装到能容纳它且目前剩余容量最小的集装箱,使得该箱子装入货物后闲置空间最小。

    【C代码】

    下面是这两个算法的C语言核心代码。

    (1)变量说明

    n:货物数

    C:集装箱容量

    s:数组,长度为n,其中每个元素表示货物的体积,下标从0开始

    b:数组,长度为n,b[i]表示第i+1个集装箱当前已经装入货物的体积,下标从0开始

    i,j:循环变量

    k:所需的集装箱数

    min:当前所用的各集装箱装入了第i个货物后的最小剩余容量

    m:当前所需要的集装箱数

    temp:临时变量

    (2)函数firstfit

    int firstfit(){

    inti,j;

    k=0:

    for(i=0;i<n;i++){

    b[i]=0;

    }

    for(i=0;i<n;i++){

    (1);

    while(C-b[j]<s[i]){

    j++;

    }

    (2);

    k=k>(j+1)?k:(j+1);

    }

    returnk;

    }

    (3)函数bestfit

    int bestfit() {

    int i,j,min,m,temp;

    k=0;

    for(i=0;i<n;i++){

    b[i]=0;

    }

    For (i=0;i<n;i++){

    min=C;

    m=k+l;

    for(j=O;j< k+l;j++){

    temp=C- b[j] - s[i];

    if(temp>0&&temp< min){

    (3) ;

    m=j,

    }

    }

    (4);

    k=k>(m+1)?k:(m+1);

    }

    return k;

    }

    【问题1】(8分)

    根据【说明】和【C代码】,填充C代码中的空(1)~(4)。

    【问题2】(4分)

    根据【说明】和【C代码】,该问题在最先适宜和最优适宜策略下分别采用了(5) 和(6)算法设计策略,时间复杂度分别为 (7) 和 (8)(用O符号表示)。

    【问题3】(3分)

    考虑实例n= 10,C= 10,各个货物的体积为{4,2,7,3,5,4,2,3,6,2}。该实例在最先适宜和最优适宜策略下所需的集装箱数分别为(9)和(10)。考虑一般的情况,这两种求解策略能否确保得到最优解?(11) (能或否)


    正确答案:

    【问题1】
    (1)j=0
    (2)b[j]=b[j]+s[i]及其等价形式
    (3) min= temp
    (4) b【m]= b[m]+[i]及其等价形式
    【问题2】
    (5)贪心
    (6)贪心
    (7)O(n2)
    (8)O(n2)
    【问题3】
    (9)5
    (10)4
    (11)否

     

  • 第2题:

    阅读下列函数说明和C代码,将应填入(n)处的字句写在对应栏内。

    【说明】

    函数QuickSort是在一维数组A[n]上进行快速排序的递归算法。

    【函数】

    void QuickSort( int A[ ],int s,int t)

    { int i=s,j=t+1,temp;

    int x=A[s];

    do{

    do i ++ ;while (1);

    do j -- ;while(A[j]>x);

    if(i<j){temp=A[i];(2);(3);}

    }while(i<j);

    A[a] =A[j];A[j] =x;

    if(s<i-1) (4);

    if(j+1<t) (5);

    }


    正确答案:(1)A[i]x (2)A[i]=A[j] 3)A[j]=temp (4)QuickSort(Asj-1) (5)QuickSort(Aj+1t);
    (1)A[i]x (2)A[i]=A[j] 3)A[j]=temp (4)QuickSort(A,s,j-1) (5)QuickSort(A,j+1,t); 解析:快速排序的思想是:任取待排序序列中的某个元素作为基准(一般取第一个元素),通过一趟排序,将待排元素分为左右两个子序列,左子序列元素的排序码均小于或等于基准元素的排序码,右子序列的排序码则大于基准元素的排序码,然后分别对两个子序列继续进行排序,直至整个序列有序。快速排序是对冒泡排序的一种改进方法,算法中元素的比较和交换是从两端向中间进行的,排序码较大的元素一次就能够交换到后面单元,排序码较小的记录一次就能够交换到前面单元,记录每次移动的距离较远,因而总的比较和移动次数较少。

  • 第3题:

    请教:2010年下半年软考程序员-上午试题(标准参考答案版)第1大题第52小题如何解答?

    【题目描述】

    ● 现需要将数字2和7分别填入6个空格中的2个(每个空格只能填入一个数字),

    已知第1格和第2格不能填7,第6格不能填2,则共有 (63) 种填法。

    (63)

    A. 12            

    B. 16               

    C. 17               

    D. 20

     

     


    正确答案:C

  • 第4题:

    请教:日语能力等级考试N3级全真模拟试题第1大题第25小题如何解答?

    【题目描述】

    第 25 题

     


    正确答案:A

  • 第5题:

    阅读下列程序说明和C++程序,把应填入其中(n)处的字句,写在对应栏内。

    【说明】

    阅读下面几段C++程序回答相应问题。

    比较下面两段程序的优缺点。

    ①for (i=0; i<N; i++ )

    {

    if (condition)

    //DoSomething

    else

    //DoOtherthing

    }

    ②if (condition) {

    for (i =0; i<N; i++ )

    //DoSomething

    }else {

    for (i=0; i <N; i++ )

    //DoOtherthing

    }


    正确答案:程序1优点:程序简洁;缺点:多执行了N-1次逻辑判断并且程序无法循环“流水”作业使得编译器无法对循环进行优化处理降低了效率。 程序2优点:循环的效率高;缺点:程序不简洁。
    程序1优点:程序简洁;缺点:多执行了N-1次逻辑判断,并且程序无法循环“流水”作业,使得编译器无法对循环进行优化处理,降低了效率。 程序2优点:循环的效率高;缺点:程序不简洁。

  • 第6题:

    请教:2010年下半年软考软件评测师-上午试题(标准参考答案版)第1大题第小题如何解答?

    【题目描述】

    ● 设用2K×4位的存储器芯片组成16K×8位的存储器 (地址单元为0000H~3FFFH,每个芯片的地址空间连续),则地址单元0B1FH所在芯片的最小地址编号为(4) 。

    (4)

    A. 0000H   

    B. 2800 H  

    C. 2000 H   

    D. 0800 H  

     

     


    正确答案:D

    答案分析:

    我觉得用2片2K×4位的存储器芯片是组成1个2K×8位的存储器单元。
    组成16K×8位的存储器需要16片2K×4位的存储器芯片。
    0000H~07FFH: 2K×4位 x2
    0800H~0BFFH: 2K×4位 x1
    0C00H~0FFFH: 2K×4位 x1
    1000H~17FFH: 2K×4位 x2
    1800H~1FFFH: 2K×4位 x2
    2000H~27FFH: 2K×4位 x2
    2800H~2FFFH: 2K×4位 x2
    3000H~37FFH: 2K×4位 x2
    3800H~3FFFH: 2K×4位 x2
    故地址单元0B1FH所在芯片的最小地址编号为0800H

  • 第7题:

    请教:新日语能力测试《N1级》模拟试题(3)第1大题第8小题如何解答?

    【题目描述】

    第 8 题

     


    正确答案:B

    答案分析:

  • 第8题:

    ●试题二

    阅读下列函数说明和C代码,将应填入(n)处的字句写在答题纸的对应栏内。

    【说明】

    该程序运行后,输出下面的数字金字塔

    【程序】

    include<stdio.h>

    main ()

    {char max,next;

    int i;

    for(max=′1′;max<=′9′;max++)

    {for(i=1;i<=20- (1) ;++i)

    printf(" ");

    for(next= (2) ;next<= (3) ;next++)

    printf("%c",next);

    for(next= (4) ;next>= (5) ;next--)

    printf("%c",next);

    printf("\n");

    }

    }


    正确答案:
    ●试题二【答案】(1)(max-′0′)(2)′1′(3)max(4)max-1(5)′1′【解析】该程序共有9行输出,即循环控制变量max的值是从1~9。每行输出分3部分,先用循环for语句输出左边空白,(1)空填"(max-′0′)";再用循环输出从1到max-′0′的显示数字,即(2)空和(3)空分别填1和max;最后输出从max-′1′~1的显示数字,即(4)空和(5)空分别填和max-1和′1′。

  • 第9题:

    试题三(共 15 分)

    阅读以下说明和 C 程序,将应填入 (n) 处的字句写在答题纸的对应栏内。


    正确答案:

  • 第10题:

    阅读下列说明和C代码,回答问题1至问题3,将解答写在答题纸的对应栏内。
    【说明】
    n-皇后问题是在n行n列的棋盘上放置n个皇后,使得皇后彼此之间不受攻击,其规则是任意两个皇后不在同一行、同一列和相同的对角线上。
    拟采用以下思路解决n-皇后问题:第i个皇后放在第i行。从第一个皇后开始,对每个皇后,从其对应行(第i个皇后对应第i行)的第一列开始尝试放置,若可以放置,确定该位置,考虑下一个皇后;若与之前的皇后冲突,则考虑下一列;若超出最后一列,则重新确定上一个皇后的位置。重复该过程,直到找到所有的放置方案。
    【C代码】
    下面是算法的C语言实现。
    (1)常量和变量说明
    pos:一维数组,pos[i]表示第i个皇后放置在第i行的具体位置。
    count:统计放置方案数。
    i,j,k:变量。
    N:皇后数。
    (2)C程序

    #include #include #define N4/*判断第k个皇后目前放置位置是否与前面的皇后冲突*/in isplace(int pos[],int k) {int i;for(i=1; i=1) {pos[j]= pos[j]+1;/*尝试摆放第i个皇后*/while(pos[j]<=N&&(3)_) {pos[j]= pos[j]+1;}/*得到一个摆放方案*/if(pos[j]<=N&&j══ N) {printf("方案%d: ",count++);for(i=1; i<=N; i++){printf("%d",pos[i]);}printf("\n");}/*考虑下一个皇后*/if(pos[j]<=N&&(4) ) {j=j+1;} else{ //返回考虑上一个皇后pos[j]=0;(5) ;}}return 1;}。

    【问题1】(10分)
    根据以上说明和C代码,填充C代码中的空(1)~(5)。
    【问题2】(2分)
    根据以上说明和C代码,算法采用了(6)设计策略。
    【问题3】(3分)
    上述C代码的输出为:(7)。


    答案:
    解析:
    【问题1】
    (1)pos[i] ==pos[k]
    (2)j=1
    (3)isplace(pos,j)==0
    (4)j(5)j=j-1
    【问题2】
    答案:回溯法
    【问题3】
    答案:
    方案1:2 4 1 3
    方案2:3 1 4 2

  • 第11题:

    阅读下列说明和C代码,回答问题1至问题3,将解答写在答题纸的对应栏内。
    【说明】
    n-皇后问题是在n行n列的棋盘上放置n个皇后,使得皇后彼此之间不受攻击,其规则是任意两个皇后不在同一行、同一列和相同的对角线上。
    拟采用以下思路解决n-皇后问题:第i个皇后放在第i行。从第一个皇后开始,对每个皇后,从其对应行(第i个皇后对应第i行)的第一列开始尝试放置,若可以放置,确定该位置,考虑下一个皇后;若与之前的皇后冲突,则考虑下一列;若超出最后一列,则重新确定上一个皇后的位置。重复该过程,直到找到所有的放置方案。
    【C代码】
    下面是算法的C语言实现。
    (1)常量和变量说明
    pos:一维数组,pos[i]表示第i个皇后放置在第i行的具体位置
    count:统计放置方案数
    i,j,k:变量
    N:皇后数



    【问题1】(10分)

    根据以上说明和C代码,填充C代码中的空(1)~(5)。

    【问题2】(2分)

    根据以上说明和C代码,算法采用了(6)设计策略。

    【问题3】(3分)

    上述C代码的输出为:(7)。


    答案:
    解析:
    【问题1】(10分)
    (1) pos[i]==pos[k]
    (2) j=1
    (3) isplace(pos,j)==0
    (4) j(5) j=j-1|
    【问题2】(2分)
    回溯法
    【问题3】(3分)
    方案1:2 4 1 3
    方案2:3 1 4 2

  • 第12题:

    阅读下列说明和?C++代码,将应填入(n)处的字句写在答题纸的对应栏内。
    【说明】
    阅读下列说明和?Java代码,将应填入?(n)?处的字句写在答题纸的对应栏内。
    【说明】
    某快餐厅主要制作并出售儿童套餐,一般包括主餐(各类比萨)、饮料和玩具,其餐品种
    类可能不同,但其制作过程相同。前台服务员?(Waiter)?调度厨师制作套餐。现采用生成器?(Builder)?模式实现制作过程,得到如图?6-1?所示的类图。






    答案:
    解析:

  • 第13题:

    阅读下列函数说明和C函数,回答问题1~2,将解答填入栏内。

    [说明]

    若矩阵Am×n中存在某个元素aij满足:aij…是第i行中最小值且是第j列中的最大值,则称该元素为矩阵A的一个鞍点。下面程序的功能是输出A中所有鞍点,其中参数A使用二维数组表示,m和n分别是矩阵A的行列数。

    [程序]

    void saddle (int A[ ] [ ], int m, int n)

    { int i,j,min;

    for (i=0;i <m;i + + )

    { min: (1);

    for (j=1; j<n; j+ +)

    if(A[i][j]<min) (2);

    for (j=0; j<n; j+ +)

    if ((3))

    { p=0;

    while (p<m&&(4))p+ +;

    if (p > = m)printf ("%d,%d,%d\n",i,j,min);

    }

    }

    }

    [问题1] 将函数代码中的(1)~(4)处补充完整

    [问题2]在上述代码的执行过程中,若A为矩阵,则调用saddle(A,3,3)后输出是(5)。


    正确答案:[问题1](1)A[i][0] (2)min=A[i][j] (3)A[i] [j]==min (4)A[p][j]=min或min=A[P] [j] [问题2](5)1211
    [问题1](1)A[i][0] (2)min=A[i][j] (3)A[i] [j]==min (4)A[p][j]=min或min=A[P] [j] [问题2](5)1,2,11 解析:本算法的基本思想是:对矩阵A逐行处理,求出每一行的最小值,对于这一行上等于最小值的那些元素,逐个判断该元素是否是所在列的最大元,如果是则打印输出。
    (1)由上下文可知min代表第i行的最小值,此处应对其赋初值:本行第一个元素;
    (2)遍历第i行后面的元素,若有元素比miu小,则应更新min的值;
    (3)此处应挑出本行中取最小值的元素进行判断;
    (4)此循环用于判断min是否是本列的最大元。
    (5)所给矩阵中只有一个鞍点11,若行列号从。开始计,它位于第l行第2列。

  • 第14题:

    阅读以下函数说明和C语言函数,将应填入(n)处的字句写在对应栏内。

    [说明]

    这是一个求解Josephus问题的函数。用整数序列1,2,3…,n表示顺序围坐在圆桌周围的人,并采用数组表示作为求解过程中使用的数据结构。Josephus问题描述,设n个人围坐在一个圆桌周围,现在从第s个人开始报数,数到第m个人,让他出局;然后从出局的下一个人重新开始报数,数到第m个人,再让他出局,…如此反复直到所有的人全部出局为止。

    [C函数]

    void Josephus(int A[],int n,s,m)

    (int i,j,k,temp;

    if(m==O){

    printf("m=0是无效的参数!\n");

    return;

    }

    for(i=0;i<n;i++) A[i]=i+1; /*初始化,执行n次*/

    i= (1) /*报名起始位置*/

    for(k=n;k>1;k-){

    if((2)) i=0;

    i=(3) /*寻找出局位置*/

    if(i!=k-1){

    tmp=A[i];

    for(j=i;J<k-1;j++) (4);

    (5);

    }

    }

    for(k=0;k<n/2;k++){

    tmp=A[k];A[k]=A[n-k+1];A[n-k+1]=tmp;

    }

    }


    正确答案:(1) s-1 (2) i==k (3) (i+m-1)%k (4) A[j]=A[j+1] (5) A[k-1]=tmp
    (1) s-1 (2) i==k (3) (i+m-1)%k (4) A[j]=A[j+1] (5) A[k-1]=tmp 解析:JosephuS问题是一个经典的顺序表问题,所用到的数据结构就是一维数组。整个算法过程实际上就是一个从n到1的循环。当还剩下k个人的时候,首先找到出局位置,然后将出局者交换到第k-1位置。循环结束,将数组逆置,即得到出局序列。空(1)是赋报名起始位置,应填“s-1”:(2)填“i==k”。空(3)是寻找出局位置,应填“(i+m-1)%k”。数组A的元素要循环向右移动一个位置,则(4)填“A[j]=A[j+1](5)填“A[k-1]=tmp”。

  • 第15题:

    试题四(共15分)

    阅读下列说明和c代码,将应填入(n)处的字句写在答题纸的对应栏内。

    【说明】

    设某一机器由n个部件组成,每一个部件都可以从m个不同的供应商处购得。供应商j供应的部件i具有重量Wij和价格Cij。设计一个算法,求解总价格不超过上限cc的最小重量的机器组成。

    采用回溯法来求解该问题:

    首先定义解空间。解空间由长度为n的向量组成,其中每个分量取值来自集合{l,2,…,m},将解空间用树形结构表示。

    接着从根结点开始,以深度优先的方式搜索整个解空间。从根结点开始,根结点成为活结点,同时也成为当前的扩展结点。向纵深方向考虑第一个部件从第一个供应商处购买,得到一个新结点。判断当前的机器价格(C11)是否超过上限(cc),重量(W11)是否比当前已知的解(最小重量)大,若是,应回溯至最近的一个活结点;若否,则该新结点成为活结点,同时也成为当前的扩展结点,根结点不再是扩展结点。继续向纵深方向考虑第二个部件从第一个供应商处购买,得到一个新结点。同样判断当前的机器价格(C11+C21)是否超过上限(cc),重量(W11+W21)是否比当前已知的解(最小重量)大。若是,应回溯至最近的一个活结点;若否,则该新结点成为活结点,同时也成为当前的扩展结点,原来的结点不再是扩展结点。以这种方式递归地在解空间中搜索,直到找到所要求的解或者解空间中已无活结点为止。

    【C代码】

    下面是该算法的C语言实现。

    (1)变量说明

    n:机器的部件数

    m:供应商数

    cc:价格上限

    w[][]:二维数组,w[i][j]表示第j个供应商供应的第i个部件的重量

    c[][]:二维数组,c[i][j]表示第j个供应商供应的第i个部件的价格

    best1W:满足价格上限约束条件的最小机器重量

    bestC:最小重量机器的价格

    bestX[].最优解,一维数组,bestX[i]表示第i个部件来自哪个供应商

    cw:搜索过程中机器的重量

    cp:搜索过程中机器的价格

    x[]:搜索过程中产生的解,x[i]表示第i个部件来自哪个供应商

    i:当前考虑的部件,从0到n-l

    j:循环变量

    (2)函数backtrack

    Int n=3;

    Int m=3;

    int cc=4:

    int w[3][3]={{1,2,3},{3,2,1},{2,2,2}};

    int c[3][3]={{1,2,3},{3,2,1},{2,2,2}};

    int bestW=8;

    int bestC=0;

    int bestX[3]={0,0,0};

    int cw=0;

    int cp=0;

    int x[3]={0,0,0};

    int backtrack(int i){

    int j=0;

    int found=0;

    if(i>n-1){/*得到问题解*/

    bestW= cw;

    bestC= cp;

    for(j=0;j<n;j++){

    (1)____;

    }

    return 1;

    }

    if(cp<=cc){/*有解*/

    found=1;

    }

    for(j=0; (2)____;j++){

    /*第i个部件从第j个供应商购买*/

    (3) ;

    cw=cw+w[i][j];

    cp=cp+c[i][i][j];

    if(cp<=cc && (4) {/*深度搜索,扩展当前结点*/

    if(backtrack(i+1)){found=1;}

    }

    /*回溯*/

    cw= cw -w[i][j];

    (5) ;

    }

    return found;

    }

    从下列的2道试题(试题五和试题六)中任选1道解答。

    如果解答的试题数超过1道,则题号小的1道解答有效。


    正确答案:

    (1)  bestX[j]=x[j]
    (2)j<m
    (3)x[i]=j
    (4)cw< bestW
    (5) cp= cp - c[i][j]

  • 第16题:

    试题四(共15 分)

    阅读下列说明和C代码,回答问题 1 至问题3,将解答写在答题纸的对应栏内。

    【说明】

    某应用中需要对100000 个整数元素进行排序,每个元素的取值在 0~5 之间。排序算法的基本思想是:对每一个元素 x,确定小于等于 x的元素个数(记为m),将 x放在输出元素序列的第m 个位置。对于元素值重复的情况,依次放入第 m-l、m-2、…个位置。例如,如果元素值小于等于4 的元素个数有 10 个,其中元素值等于 4 的元素个数有3个,则 4 应该在输出元素序列的第10 个位置、第 9 个位置和第8 个位置上。

    算法具体的步骤为:

    步骤1:统计每个元素值的个数。

    步骤2:统计小于等于每个元素值的个数。

    步骤3:将输入元素序列中的每个元素放入有序的输出元素序列。

    【C代码】

    下面是该排序算法的C语言实现。

    (1)常量和变量说明

    R:常量,定义元素取值范围中的取值个数,如上述应用中 R值应取6i:循环变量

    n:待排序元素个数

    a:输入数组,长度为n

    b:输出数组,长度为n

    c:辅助数组,长度为R,其中每个元素表示小于等于下标所对应的元素值的个数。

    (2)函数sort

    1 void sort(int n,int a[ ],intb[ ]){

    2 int c[R],i;

    3 for (i=0;i< (1) ;i++){

    4 c[i]=0;

    5 }

    6 for(i=0;i<n;i++){

    7 c[a[i]] = (2) ;

    8 }

    9 for(i=1;i<R;i++){

    10 c[i]= (3) ;

    11 }

    12 for(i=0;i<n;i++){

    13 b[c[a[i]]-1]= (4) ;

    14 c[a[i]]=c[a[i] ]-1;

    15 }

    16 }

    【问题1】(8 分)

    根据说明和C代码,填充 C代码中的空缺(1)~(4)。

    【问题2】(4 分)

    根据C代码,函数的时间复杂度和空间复杂度分别为 (5) 和 (6) (用 O符号

    表示)。

    【问题3】(3 分)

    根据以上C代码,分析该排序算法是否稳定。若稳定,请简要说明(不超过 100 字);

    若不稳定,请修改其中代码使其稳定(给出要修改的行号和修改后的代码)。

    从下列的2 道试题(试题五和试题六)中任选 1 道解答。

    如果解答的试题数超过 道,则题号小的 道解答有效。


    正确答案:
    试题四参考答案(共15分)
    【问题1】(8分)
    (1)R   
    (2)c[a[i]]+l  
    (3)c[i]+c[i -1]   
    (4)a[i]  
    【问题2】(4分)
    (5)O(n+R)或者O(n)或n或线性 
    (6)O(n+R)或者O(n)或n或线性
    【问题3】(3分)
    不稳定。修改第12行的for循环为:for(i=n-1;i>=0;i--){即可。

  • 第17题:

    阅读以下说明和流程图,回答问题,并将解答填入对应栏内。

    【说明】

    求解约瑟夫环问题。算法分析:n个士兵围成一圈,给他们依次编号,班长指定从第w个士兵开始报数,报到第s个士兵出列,依次重复下去,直至所有士兵都出列。

    【流程图】

    【问题】

    将流程图中的(1)~(5)处补充完整。


    正确答案:(1)L[i].nextp=1 (2) k=w-1 (3) count!=n (4) ++I (5) ++count
    (1)L[i].nextp=1 (2) k=w-1 (3) count!=n (4) ++I (5) ++count

  • 第18题:

    请教:2011年软件设计师考试考前密卷(二)-上午试题第1大题第20小题如何解答?

    【题目描述】

    ●n个结点的二叉树,若用二叉链表作为存贮结构,则左、右子链域的总数为 (45) 个,其中 (46) 个用于链接子结点, (47) 个空闲着。

    (45)

    A.n

       B.n-1

       C.n+1

       D.n-2

    (46) A.n-1

       B.n

       C.n+1

       D.n-2

    (47) A.n+10

       B.n

       C.n+1

       D.n+9

     


    问题1
    【参考答案与解析】:

     

    正确答案:B

    问题2
    【参考答案与解析】:

     

    正确答案:A

    问题3
    【参考答案与解析】:

     

    正确答案:C

    答案分析:

    【解析】①二叉树中每个结点有两个子链域,故n个结点有n-1个左、右子链域。②除根结点之外,其他每个结点都有且仅有一个分支,故n个结点的二叉树中有n-1个分支;而这些分支是由上一层结点的子链域发出的,因此n个结点的二叉树中有n-1个链域链接孩子。③空闲的孩子链域数=2n-(n-1)=n+1。

  • 第19题:

    阅读下列说明和c++代码,将应填入(n)处的字句写在答题纸的对应栏内。

    【说明】

    某灯具厂商欲生产一个灯具遥控器,该遥控器具有7个可编程的插槽,每个插槽都

    有开关按钮,对应着一个不同的灯。利用该遥控器能够统一控制房间中该厂商所有品牌

    灯具的开关,现采用Command(命令)模式实现该遥控器的软件部分。Command模式

    的类图如图5-1所示。

    【c++代码】

    }


    正确答案:
    本题考查命令(Command)模式的基本概念和应用。命令模式把一个请求或者操作封装到一个对象中。命令模式允许系统使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。在软件系统中,行为请求者与行为实现者之间通常呈现一种紧耦合的关系。但在某些场合,比如要对行为进行记录撤销重做事务等处理,这种无法抵御变化的紧耦合是不合适的。这种情况下,使用Command模式将行为请求者与行为实现者进行解耦。题目中给出了Command模式的类图,其中:Command类为所有命令声明了一个接口。调用命令对象的execute()方法,就可以让接收者进行相关的动作。ConcreteCommand类定义了动作和接收者之间的绑定关系。调用者只要调用execute()就可以发出请求,然后由ConcreteCommand调用接收者的一个或多个动作。Invoker持有一个命令对象,并在某个时间点调用命令对象的execute()方法,将请求付诸实行。Receiver知道如何进行必要的工作,实现这个请求。任何类都可以当接收者。了解了Command模式的内涵之后,下面来看程序。由于Command类的主要作用是为所有的ConcreteCommand定义统一的接口,在c++中通常采用抽象类来实现。C++的抽象类是至少具有一个纯虚拟函数的类。本题中的接口就是execute()方法,所以(1)处要求填写的是纯虚拟函数cxecute的定义方式,即vifrualvoidexecute()=0。类LightOnCammand、LightOfiCommand对应的就是模式中的ConcreteCommand;ConcreteCommand中execute()方法的代码在类图中已经给出,现在需要确定recelver是谁。类Light充当的是Receiver,其中定义了两种action:on和off.所以(2)、(3)对应代码分别为light->on()、light->off()。类RemoteControl对应的是模式中的Invoker,在该类中设置需要控制的命令对象。(4)处对应的代码为onCommands[slot],设置“开灯”命令对象;(5)处对应的代码为affcommands[slot].设置‘关灯”命令对象。类RemoteControl中的方法onButtanWasPushed和offlButtonWasPushed,分别完成对开灯、关灯命令对象的execute方法的调用,所以(6)、(7)处分别对应代码onCommands[slot]->execute()、offCommands[slot]->execute()。试题五参考答案(1)virtualvoidexecute()=0(2)light->on()(3)light->off()(4)onCommands[slot](5)offCommands[slot](6)onCommands[slot]->execute()(7)offCommands[slot]->execute()

  • 第20题:

    ●试题一

    阅读下列说明和流程图,将应填入(n)处的语句写在答题纸的对应栏内。

    【说明】

    下列流程图用于从数组K中找出一切满足:K(I)+K(J)=M的元素对(K(I),K(J))(1≤I≤J≤N)。假定数组K中的N个不同的整数已按从小到大的顺序排列,M是给定的常数。

    【流程图】

    此流程图1中,比较"K(I)+K(J)∶M"最少执行次数约为 (5) 。

    图1


    正确答案:
    ●试题一【答案】(1)(2)<(3)I+l->I(4)J-1->J(5)「N/2」【解析】该算法的思路是:设置了两个变量I和J,初始时分别指向数组K的第一个元素和最后一个元素。如果这两个元素之和等于M时,输出结果,并这两个指针都向中间移动;如果小于M,则将指针I向中间移动(因为数组K已按从小到大的顺序排列);如果大于M,则将指针J向中间移动(因为数组K已按从小到大的顺序排列)。当IJ时,说明所有的元素都搜索完毕,退出循环。根据上面的分析,(1)、(2)空要求填写循环结束条件,显然,(1)空处应填写"",(2)空处应填写"<"。这里主要要注意I=J的情况,当I=J时,说明指两个指针指向同一元素,应当退出循环。(3)空在流程图有两处,一处是当K(I)+K(J)=M时,另一处是当K(I)+K(J)<M时,根据上面分析这两种情况都要将指针I向中间移动,即"I+1->I"。同样的道理,(4)空处应填写"J-1->J"。比较"K(I)+K(J):M"最少执行次数发生在第1元素与第N个元素之和等于M、第2元素与第N-1个元素之和等于M、……,这样每次比较,两种指针都向中间移动,因此最小执行次数约为"N-2"。

  • 第21题:

    阅读下列说明,回答问题1至问题3,将解答填入对应栏内。

    【说明】

    某餐厅供应各种标准的营养套餐。假设菜单上共有n项食物m1,m2,…,mn,每项食物mi的营养价值为vi,价格为pi其中i=1,2,…,n,套餐中每项食物至多出现一次。客人常需要一个算法来求解总价格不超过M的营养价值最大的套餐。

    1. 【问题1】

    下面是用动态规划策略求解该问题的伪代码,请填充其中的空缺(1)、(2)和(3)处。

    伪代码中的主要变量说明如下。

    n:总的食物项数;

    v:营养价值数组,下标从1到n,对应第1到第n项食物的营养价值;

    p:价格数组,下标从1到n,对应第1到第n项食物的价格;

    M:总价格标准,即套餐的价格不超过M;

    x:解向量(数组),下标从1到n,其元素值为0或1,其中元素值为0表示对应的食物不出现在套餐中,元素值为1表示对应的食物出现在套餐中;

    nv:n+1行M+1列的二维数组,其中行和列的下标均从0开始,nv[i][j]表示由前i项食物组合且价格不超过j的套餐的最大营养价值。问题最终要求的套餐的最大营养价值为nv[n][M]。

    伪代码如下:

    MaxNutrientValue(n,v,p,M,x)

    1 for i=0 to n

    2 nv[i][0] = 0

    3 for j=1 to M

    4 nv[0][j]=0

    5 for i=1 to n

    6 for j=1 to M

    7 if j<p[i] //若食物mi不能加入到套餐中

    8 nv[i][j] = nv[i-1][j]

    9 else if (1)

    10 nv[i][j]= nv[i-1][j]

    11 else

    12 nv[i][j]= nv[i-1][j-p[i]] + v[i]

    13 j = M

    14 for i=n downto 1

    15 if (2)

    16 x[i] = 0

    17 else

    18 x[i] = 1

    19 (3)

    20 return x and nv[n][M]

    (1)nv[i-1][j]≥nv[i-1][j-p[i]]+v[i] (2)nv[i][j]=nv[i-1][j] (3)j=j-p[i]


    正确答案:(1)nv[i-1][j]nv[i-1][j-p[i]]+v[i] (2)nv[i][j]=nv[i-1][j] (3)j=j-p[i]
    (1)nv[i-1][j]nv[i-1][j-p[i]]+v[i] (2)nv[i][j]=nv[i-1][j] (3)j=j-p[i]

  • 第22题:

    阅读下列说明和 C 代码,回答问题 1 和问题 2,将解答填入答题纸的对应栏内。【说明】某公司购买长钢条,将其切割后进行出售。切割钢条的成本可以忽略不计,钢条的长度为整英寸。已知价格表 P,其中中 Pi(i=1,2,...,m)表示长度为 i 英寸的钢条的价格。现要求解使销售收益最大的切割方案。求解此切割方案的算法基本思想如下:假设长钢条的长度为 n 英寸,最佳切割方案的最左边切割段长度为 i 英寸,则继续求解剩余长度为 n-i 英寸钢条的最佳切割方案。考虑所有可能的 i,得到的最大收益 rn对应的切割方案即为最佳切割方案。rn的递归定义如下:rn =max1≤ i ≤n(pi +rn-i)对此递归式,给出自顶向下和自底向上两种实现方式【C 代码】/*常量和变量说明n:长钢条的长度P[]:价格数组*/#define LEN 100int Top_Down_Cut_Rod(int P[], int n){/*自顶向下*/ int r = 0; int i; if (n == 0){ return 0; } for (i = 1; (1); i++){ int tmp = P[i] + Top_Down_Cut_Rod(p, n - i); r = (r >= tmp) ? r : tmp; } return r;}int Bottom_Up_Cut_Rod(int p[], int n){ /*自底向上*/ int r[LEN] = { 0 }; int temp = 0; int i, j; for (j = 1; j <= n; j++){ temp = 0; for (i = 1; (2); i++){ temp = (3); } (4); } return r[n];}【问题 1】(8 分)根据说明,填充 C 代码中的空(1)~(4)。

    【问题 2】(7 分)根据说明和 C 代码,算法采用的设计策略为(5)。求解 rn时,自顶向下方法的时间复杂度为(6);自底向上方法的时间复杂度为(7)(用 O 表示)。


    答案:
    解析:
    【问题 1】(8 分) (1)i<=n(2)i<=j(3)temp=(temp>=r[i]+r[j-1])?temp:(r[i]+r[j-1])(4)r[j]=temp【问题 2】(7 分) (5)动态规划(6)O(2n)(7)O(n2)

  • 第23题:

    阅读下列说明和Java代码,将应填入(n)处的字句写在答题纸的对应栏内。【说明】 某文件管理系统中定义了类OfficeDoc和DocExplorer,当类OfficeDoc发生变化时,类DocExplorer的所有对象都要更新其自身的状态,现采用观察者(Observer)设计模式来实现该需求,所设计的类图如图6-1所示。



    答案:
    解析:
    1: void update()2: Observer3: obs.update()4: Subject5: Attach(this)