实验报告
课程名称 《算法分析与设计》
实验日期 2021年 5 月 17 日 至 2021年 5 月23日
实验名称 实验十:装载问题
实验地点 同组人员 无
-
问题
有一批共n个集装箱要装上2艘载重量分别为c1和c2的轮船,其中集装箱i的重量为wi,且集装箱总重小于等于轮船总载重。
要求确定是否有一个合理的装载方案可将这批集装箱装上这2艘轮船。如果有,找出一种装载方案. -
解析
假如要将集装箱装进两艘轮船,那么先将第一艘轮船尽可能装满,再将剩下的尽量装进第二艘。
因此原问题可以分解为两个问题:从所有集装箱中挑选出使得货轮1载重最大的,然后再从剩下的集装箱中选出使得货轮2载重最大的。即等价于重量的特殊的0-1背包问题。 -
设计
[核心伪代码]
void Backtrack(int i,int cw,int w[],int x[])
{
if(i>=N)//到达叶子结点
{
if(cw>bestw)
{
bestw=cw;
for(int i=0;i<N;i++)
y[i]=x[i];
}
return;
}
r-=w[i];
//搜索子树
if(cw+w[i]<=c)
{
x[i]=1;
cw+=w[i];
Backtrack(i+1,cw,w,x);
cw-=w[i];
x[i]=0;
}
if(cw+r>bestw) //上界函数,保证到达叶结点时候的cw都优于当前的最优解bestw
{
x[i]=0;
Backtrack(i+1,cw,w,x);
}
r+=w[i];
} -
分析
[算法复杂度推导]
时间复杂度为O(n*2^n) -
[github源码地址]
https://github.com/zjk715/–homework