2012年下半年软件设计师算法题

本文解析了货运装箱问题中,最先适宜(firstfit)与最优适宜(bestfit)策略的C代码实现,探讨了它们的时间复杂度,并通过实例n=10,C=10分析两种策略所需集装箱数。讨论了这两种方法是否能保证最优解。
摘要由CSDN通过智能技术生成

装箱问题

试题四(共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() {
    int i, j;
    k = 0; //集装箱个数
    for(i = 0;i < n;i++){
        b[i]=0; //0表示第i+1个集装箱未装任何货物,
    }
    for(i = 0;i < n;i++){
        (1);
        while(C - b[j] < s[i]){ //第i+1个集装箱剩余容量与下一个货物体积进行比较
            j++;            //集装箱剩余空间小于下一个货物体积则选择下一个集装箱进行装载货物
        }
        (2);                //集装箱当剩余前容量+装入货物体积
        k = k > (j + 1) ? k : (j + 1);
    }
    return k; //返回所需集装箱个数
}

(3)函数bestfit

int bestfit() {    //最优适宜策略
    int i,j,min,m,temp;
    k = 0;    //集装箱个数    
    for(i = 0;i < n;i++){
        b[i]=0;    //0表示第i+1个集装箱未装任何货物
    }
    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) (能或否)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值