1.问题
在不超过轮船载重量的前提下,将尽可能多的集装箱数目装上轮船
2.解析
思路:轻者先装,直到再装超过载重量C为止
定理:对于任何整数k,轻者先装对k得到最优解。
证明:
(1)k=1,任何装法都是最优解,因此轻者先装也是最优解。
(2)假设算法对于规模为k的输入都能得到最优解
当k+1时,N={1,2,…,k,k+1},W={w1,w2,…,wk,wk+1}(w1<w2<…<wk<wk+1)
从N中拿掉最轻的1,得到k规模:
N’=N-{1}={2,3,…,k+1}
W’=W-{w1}
C’=C-w1
根据假设,对k,最优解为I’,即I’为N’
令I=I’+{1}
那么I必然是N的最优解
证明:I必然是N的最优解(反证)
假设I不是N的最优解
(1)构建最优解I*(是N的最优解,包含1):假设I不是N的最优解,则必然存在最优解I*,如果I中没有1,用1替代其中最小的后它还是最优解,使得I为包含1的关于N的最优解,且|I*|>|I|。
(2)构建最优解I*’(是N的最优解,不包含1):因为I为包含1的关于N的最优解,则I’是关于N的不含1的最优解(待证明)。
证明:I*’=I*-{1}是是不包含1的最优解。(反证)
如果I*’不是不包含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.设计
无
4.分析
时间复杂度:O(nlogn)
5.源码
无