设有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);
}
return k;
}
(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+1;
for(j=0;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]+s[i]
【问题2】
(5)贪心
(6)贪心
(7)O(n2)
(8)O(n2)
【问题3】
(9)5
(10)4
(11)否
本题考查最先适宜策略和最优适宜策略。这两种策略在题目的描述中给出了清楚的解析,对于最先适宜策略,其关键是每次将一个货物装入第一个能容纳它的集装箱中;而对于最优适宜策略,则总是把货物装到能容纳它且目前剩余容量最小的集装箱。
下面我们来具体分析程序。函数firstfit()是实现最先适宜策略的,从程序不难看出,第(1)空所在的for循环,就是要将n各货物装入到集装箱。根据算法的描述,是依次从第一个集装箱找,找到合适的就装入货物,依次没装入一个货物,都是依次从第一个集装箱找。结合后面的程序不难知道j标识这当前是第几个集装箱。因此每装入一个货物后,要将j清0,标识从头再找,因此第(1)空的答案是j=0。而接下来的while循环,从其条件表达式C-b[j]<s[i]不难知道,是比较当前集装箱和当前货物的体积大小,如果当前集装箱体积小,则比较下一个集装箱,否则,就应该将货物装入该集装箱,并且调整集装箱剩余体积的大小,在本题中,这个是通过数组b来实现的,因此第(2)空的答案应该为b[j]=b[j]+s[i]。
第(3)和第(4)空是在函数bestfit()下,这个函数是实现最优适宜策略的。从程序中不难看出,for(j=0;j<k+l;j++)就是要在众多的集装箱中找到最合适的集装箱,而第(3)空是条件if(temp>0&&temp<min)成立时,执行的语句,该条件成立,表示当前找到的集装箱比原来确定的集装箱更合适,而最合适的集装箱的剩余体积存放在min中,因此第3空的答案为min=temp,而循环结束后,就应该找到了合适的集装箱,这时应该将货物存放到集装箱里面,即第(4)空的答案为b[m]=b[m]+s[i]。
在本题中,不管是采用最先适宜策略,还是最优适宜策略,他们都是根据不同策略选择目前看来最优的情况,这都属于贪心算法的思想。从两个函数不难看出,其时间复杂度是一样的,都是O(n2)。
第3个问题,其实是这个题目中最简单的问题,也是算法的一个实际应用。对于这个实例,如果采用最先适宜策略,那么货物{4,2,3}存放在第一个集装箱,而{7,2}存放在第二个集装箱,{5,4}存放在第三个集装箱,{3,6}存放在第四个集装箱,而{2}存放在第五个集装箱。
如果采用最优适宜策略,那么货物{4,2,4}存放在第一个集装箱,而{7,3}存放在第二个集装箱,{5,2,3}存放在第三个集装箱,{6,2}存放在第四个集装箱。
因为这两种方法都是采用的贪心策略,那么在一般情况下,是不能确保得到最优解的。
包含此试题的试卷
你可能感兴趣的试题
某监理单位承担了某政府机关网络平台和机房建设工程监理工作。通过公开招标,确定工程承建单位是公司A,按照《合同法》要求与公司A签订了工程建设合同并在合同中规定,公司A可以将机房工程这样非主体、非关键性子工程分包给具备相关资质专业公司。在工程项目实施过程中,发生了如下事件:
事件1:公司A在征得建设单位同意后,将其中机房工程建设工作分包给具有相应资质公司B,并将分包结果以书面形式通知了监理单位。
事件2:在机房工程施工中,总监理工程师在巡视中发现施工人员为了赶工期,把信号线和电源线放在了同一线槽中,违反了有关规范中信号线防干扰规定。总监理工程师随即要求公司B保护好施工现场并于2小时内将发生质量事故情况以书面形式上报建设单位和监理单位以便共同确认处理意见。
事件3:签订合同后,公司A向监理提交了《网络工程建设进度计划》,监理审核后认为该计划符合要求并予以签认。
事件4:工程验收是信息网络系统建设收尾工作,公司A按《网络工程建设进度计划》规定时间于9月10日完工,并于9月15日提出验收申请。在确认工程项目已经达到验收条件情况下,三方决定对项目实施验收,成立工程验收小组由5人组成,其中建设单位项目负责人1人、监理单位人员1人、外聘专家3人。
【问题1】在事件1中,公司A分包过程是否妥当?为什么?
【问题2】在事件2中,总监理工程师做法是否妥当?为什么?
【问题3】在事件3中,监理单位做法妥当吗?阐述监理在实施进度控制时,可以采用基本措施是什么。
【问题4】在事件4中,验收小组组成妥当吗?为什么?正式验收一般程序包括八个步骤,请列出。
- 查看答案
信息网络系统是信息系统重要组成部分,对信息网络系统监理工程实施是信息网络工程建设重要组成部分。
【问题1】信息网络系统现场实施通常分哪几个步骤进行?(5分)
【问题2】请简述网络设备采购到货环节监理流程。(5分)
【问题3】请列出两种信息网络系统常用监理方法,并对列出监理方法给出简要说明。(5分)
【问题4】在信息网络系统完工时,应由建设单位、承建单位和监理单位三方共同确定验收方案。验收方案确认重点工作之一就是确认工程验收基本条件是否满足要求,这时监理单位主要工作是什么?(5分)
- 查看答案
根据你所学监理知识,回答问题1至问题5,将解答填入答题纸对应栏内。(每个问题,回答一条得一分,每个问题只需答对4条即满分)
【问题1】(4分)
信息网络系统验收前提条件是什么?
【问题2】(4分)
信息应用系统验收前提条件有哪些?
【问题3】(4分)
网络设备和TCP/IP网络检测主要考虑技术指标有哪些,分别对四个指标名字进行简要解释。(只写出四个指标名字,可以给满分)
【问题4】(4分)
光缆测试有哪四种?各有什么工具测?
【问题5】(4分)
根据发改委55号令,初步验收时,建设单位对?、?、?、?进行验收,形成初验报告?
- 查看答案
某工程,实施过程中发生如下事件:[事件1]:总监理工程师组建项目监理机构组织形式如图2015-1-1所示。
[事件2]:在第一次工地会议上,总监理工程师提出以下两方面要求,一是签发工程暂停令情形包括:①建设单位要求暂停施工;②施工单位拒绝项目监理机构管理;③施工单位采用不适当施工工艺或施工不当,造成工程质量不合格。二是签发监理通知单情形包括:①施工单位违反工程建设强制性标准;②施工存在重大质量、安全事故隐患。[事件3]:专业监理工程师编写深基坑工程监理实施细则主要内容包括:专业工程特点、监理工作方法及措施。其中,在监理工作方法及措施中提出:①要加强对深基坑工程施工巡视检查;②发现施工单位未按深基坑工程专项施工方案施工,应立即签发工程暂停令。[事件4]:施工过程中,施工单位对需要见证取样一批钢筋抽取试样后,报请项目监理机构确认。监理人员确认试样数量后,通知施工单位将试样送到检测单位检验。问题:1.指出图1-1所示项目监理机构组织形式属哪种类型,说明其主要优点。(5分)2.指出事件2中签发工程暂停令和监理通知单情形不妥项,并写出正确做法。(5分)3.写出事件3中监理实施细则还应包括内容。指出监理工作方法及措施中提出具体要求是否妥当并说明理由。(3分)4.指出事件4中施工单位和监理人员不妥之处,写出正确做法。(2分)
- 查看答案
【说明】某企业信息系统工程项目,包括网络建设、机房系统建设、软件开发等多个项目,甲公司为建设单位,通过公开招投标方式选择乙为承建方,丙为监理方,在项目实施过程中发生了如下事件: 【事件1】为保证系统建设过程中开发需求准确无误,在软件开发之前,监理方严格执行信息系统建设相关规定,协助承建方完成了需求分析。 【事件2】在项目业务软件开发实施过程中,由于乙方由于原因导致项目进度滞后,甲丶丙方多次要求乙方尽快调整进度。迫于甲丶丙方压力,乙方在甲、丙方不知情情况下,从其他项目组抽调多名技术人员,加入到本项目现场开发工作中,丙方在发现后立刻向乙方发停工令,要求新加入人员所承担工作暂时停工,乙方认为监理方做法错误并影响了工程进度,并应该补偿有此造成工期损失。 【事件3】在项目实施过程中,为了确保代码质量,承建单位除了按合同要求对开发过程进行有效控制外,还将测试覆盖率由 60%提高到 90%,为此增加成本 57 万。实施完成后,承建单位向监理工程师提出费用补偿要求。 【事件4】在一次项目沟通会上,甲方提出对软件功能进行小幅调整,会上通过甲乙方充分讨论,均认为需求变更确有必要,工作量增加不大,乙方便同意了甲方变更要求并实施。 【问题1】 (6分) 针对事件 1,需求分析阶段成果有哪些? 【问题2】 (6分)在事件2中,作为监理工程师,请回答;(1) 监理方做法是错误吗?请说出理由。(2) 乙方新进人员资质有问题吗?请说出理由。(3) 应该给乙方相应工期补偿吗? 【问题3】 (4分)针对问题3,作为监理工程师,你是否同意承建单位费用补偿要求,并说明理由。 【问题4】 (4分) 请指出事件4中应用软件变更中存在错误做法。
- 查看答案