算法分析与设计homework_10

这篇博客探讨了一种解决将n个不同重量的集装箱装载到两艘具有特定载重量的轮船上的问题。通过将问题转化为0-1背包问题,并利用回溯法寻找最优装载方案。当一艘船尽可能被填满后,剩余的集装箱装入第二艘船。作者给出了问题的解析、核心代码实现以及时间复杂度分析。示例中展示了如何在不同权重配置下找到可行的装载策略。
摘要由CSDN通过智能技术生成

1.问题
有n个集装箱要装上2艘载重量分别为c1和c2的轮船,其中集装箱i的重量为wi,且
在这里插入图片描述
是否有一个合理的装载方案,可将这n个集装箱装上这2艘轮船?如果有,找出一种装载方案。

2.解析
例如:当n=3, c1=c2=50

(1)若w=[10, 40, 40]

可将集装箱1和集装箱2装上第一艘轮船,而将集装箱3装上第二艘轮船;

(2)如果w=[20, 40, 40]

则无法将这3个集装箱都装上船;

已证明,如果一个给定装载问题有解,则采用下面的策略可得到最优装载方案。

1. 首先将第一艘轮船尽可能装满;
  2. 将剩余的集装箱装上第二艘轮船。

将第一艘轮船尽可能装满等价于选取全体集装箱的一个子集,使该子集中集装箱重量之和最接近c1。由此可知,装载问题等价于以下特殊的0-1背包问题。

3.设计
核心代码
template
void Loading::Backtrack(int i)
{ / /搜索第i层结点
if (i>n) {//到达叶结点
bestw=cw;
return;
}
r - = w[i]; //搜索子树
if (cw+w[i]<=c){ //搜索左子树
x[i]=1;
cw += w[i];
Backtrack (i+1);
cw - = w[i];
}
if (cw+r > bestw){ //搜索右子树
x[i]=0;
Backtrack(i+1);
}
r+=w[i]
4.分析
时间复杂度为O(2^n)
5.源码
https://github.com/951390752/Algorithm_analysis_and_design-homework/blob/main/homework_10/backtrack.cpp

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值