算法分析与设计作业十——装载问题(0-1背包问题)

1.问题

在这里插入图片描述

2.解析

思路:轻者先装,直到再装任何集装箱将使轮船载重量超过C时停止。
定理:对于任何正整数k,算法(轻者先装)对k个集装箱的实例得到最优解。
证明:(数学归纳法)
(1)k=1,只有1个集装箱,其重量小于C。任何装法都只有一种方式,因此都是最优解,因此轻者先装也是最优解。
(2)归纳假设:假设算法对于规模为k的输入都能得到最优解。
考虑规模为k+1的输入,N={1,2,…,k+1},W={w1,w2,…,wk+1}是集装箱重量,w1≤w2≤…≤wk+1。
从N中拿掉最轻的集装箱,得到k规模的输入:
N’=N-{1}={2,3,…,k+1}
W’=W-{w1}
C’=C-w1
根据归纳假设,对于k个输入,N’、W’、C’的最优解为I’,即I’为N’,不含1的最优解(归纳假设得),令
I=I’∪{1}
那么I必然是N的最优解,这也是算法对于N,W,C的解。
证明:I必然是N的最优解,采用反证法,即假设I不是N的最优解。
(1)构建最优解I*(N,含1):假设I不是N的最优解,则必然存在最优解I*,如果I中没有1,用1替代I中的第一个集装箱标号得到的解也是最优解(个数不变,因此也是最优解),使得I为包含1的关于N的最优解,且|I|>|I|。
(2)构建最优解I*’(N’,不含1):因为I为包含1的关于N的最优解,构建的I’=I*-{1}是不包含1 的最优解(待证明),即关于N’、W’、C’的最优解(N’、W’、C’不包含1)。
证明:I’=I-{1}是不包含1的最优解。**
证(反证法):如果I*’=I*-{1}不是不包含1的最优解,那么存在最优解I*’’(N’,不含1),使得|I*’|<|I*’’|,
即|I*’+{1}|<|I*’’+{1}|,与I*’+{1}=I为最优矛盾,因此I’=I*-{1}是不包含1的最优解。
(3)构建的最优解I*’与归纳假设的最优解I’比较:由(1)的|I*|>|I|得,|I*’|=|I*-{1}|>|I-{1}|=|I’|,与I’的最优性矛盾(最优解I*-{1}大于最优解I’)。

3.设计

t=最终装载重量,C=轮船最大载重量,j=最多装载的集装箱个数,W为各个集装箱重量数组(已排序)

while{
		if(t+W[j]>C){
			break;
		}
		t+=W[j];
		j++;
}

4.分析

复杂度:O(nlogn)

5.源码

https://github.com/Hyacincy/-/blob/main/%E8%A3%85%E8%BD%BD%E9%97%AE%E9%A2%98.cpp

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值