解算法:动态规划、贪心算法、回溯法都可以
有n个重量为w(i)的集装箱,要装入到两艘轮船A和B,轮船的载重量分别为W(1)和W(2),问:能否找到一组装载方案?
2,涉及变量、定量:
W(1):第一艘轮船的载重量(最大能装的重量)
W(2):第二艘轮船的载重量
A:第一艘轮船
B:第二艘轮船
w(i):第i个集装箱的重量
n:集装箱的数量
w:集装箱总重
cw(1):第一艘轮船的当前载重量(现在装了多少)
cw(2):第二艘轮船的当前载重量
mw(1):第一艘轮船的最优载重量(装载的最优情况)
mw(2):第二艘轮船的最优载重量
关键词:载重量、当前载重量、最优载重量
3,证明:
(1)若要往一艘轮船中装载集装箱,那么尽量使得载重量最大。(这里可用贪心,也可以用动态规划)
证明:若A轮船装了cw(1)。这时如果可以优化A轮船的装载方案,使得mw(1),这是合理的。
因为w-cw(1)>=w-mw(1),B轮船肯定能装下剩余的集装箱
(2)要先尽量往哪个轮船装集装箱呢?
证明:假设是有解的
①W(1)=W(2):属于划分问题,尽量将A轮船装满是合理的
②W(1)>W(2)且W(1)=mw(1):必然w-mw(1)<=W(2)
③W(1)>W(2)且W(1)>mw(1):mw(1)是A轮船的最优载重量,所以必然mw(1)>=cw(1),则这时w-mw(1)<=cw(2)<=W(2)。B轮船必然能装下剩余的集装箱
④W(1)<W(2)且W(1)=mw(1):同②
⑤W(1)<W(2)且W(1)<mw(1):同③
综上,尽量往哪个轮船装集装箱都是合理的。
-------------------------------------分割线---------------------------
拓展:
有n个重量为wi的集装箱,要装入到m艘轮船,轮船的载重量为Wj,问:能否找到一组装载方案?
好,现在来思考一下这个比较现实的问题,同样先假设是有解的,那么令m艘轮船的当前载重量分别为cw(1)、cw(2)、……、cw(m)
1,附加变量、定量:
cw(i,j):表示第i艘轮船与第j艘轮船的总的当前载重量
mw(i,j):表示第i艘轮船与第j艘轮船的总的最优载重量
2,证明:
(1)当只有3艘轮船A、B、C时,使得其中两艘轮船的当前载重量最优,是合理的
证明:这其实就相当于是将其中两艘轮船融合在一起(但是并不是完全融合,因为还是会有一些能空出来的地方能装东西)
假设轮船A与轮船B的总的当前载重量为cw(1,2),则若更改装载方案,使得mw(1,2)。
这时w-mw(1,2)<=w-cw(1,2)<=cw(3),显然这是合理的
(2)尽量装满载重量大的轮船
证明:而上述的(1)证明中,其实并没有硬性要求轮船A、B的载重量都大于C。那么,可以类似地求解当轮船数为m时的情况。
数学归纳法:
①假设当k=2时,命题成立。根据前面的k=2时的证明可知,k=2时,命题是成立的。
②假设当k=m且m>2时,命题成立。即当k=m时,尽量装满载重量大的轮船时合理的。
当k=m+1且m>2时,由上面的(1)可知,轮船的组合并没有硬性要求。
综上可知,尽量装满载重量大的轮船是合理的。
3,解法思路:
(1)将所有集装箱进行降序排序
(2)将所有轮船按其载重量进行降序排序
(3)用贪心法,逐个逐个将轮船装满
(4)若当所有轮船都遍历完毕时,没有剩余的集装箱则表示有解;否则无解
算法复杂度:
O(n,m) = O(n)+O(m)+O(nm)
算法优化:
在平均情况下进行优化
(1)记录仍未装载的、重量最大的集装箱的下标,一轮结束后直接从该下标开始,减少考虑范围。
(2)构造最优解:令整型数组x[n]中,0表示未装箱,i表示第i个轮船装载了该集装箱
-------------------------------------分割线---------------------------
升级:
有n个重量为wi的集装箱(长宽高分别为a、b、c),要装入到m艘轮船(装箱长宽高分别为A、B、C),轮船的载重量为Wj,问:能否找到一组装载方案?
目录:
1,问题描述
2,涉及变量、定量
3,证明
拓展:
1,附加变量、定量
2,证明
3,解法思路
有n个重量为w(i)的集装箱,要装入到两艘轮船A和B,轮船的载重量分别为W(1)和W(2),问:能否找到一组装载方案?
2,涉及变量、定量:
W(1):第一艘轮船的载重量(最大能装的重量)
W(2):第二艘轮船的载重量
A:第一艘轮船
B:第二艘轮船
w(i):第i个集装箱的重量
n:集装箱的数量
w:集装箱总重
cw(1):第一艘轮船的当前载重量(现在装了多少)
cw(2):第二艘轮船的当前载重量
mw(1):第一艘轮船的最优载重量(装载的最优情况)
mw(2):第二艘轮船的最优载重量
关键词:载重量、当前载重量、最优载重量
3,证明:
(1)若要往一艘轮船中装载集装箱,那么尽量使得载重量最大。(这里可用贪心,也可以用动态规划)
证明:若A轮船装了cw(1)。这时如果可以优化A轮船的装载方案,使得mw(1),这是合理的。
因为w-cw(1)>=w-mw(1),B轮船肯定能装下剩余的集装箱
(2)要先尽量往哪个轮船装集装箱呢?
证明:假设是有解的
①W(1)=W(2):属于划分问题,尽量将A轮船装满是合理的
②W(1)>W(2)且W(1)=mw(1):必然w-mw(1)<=W(2)
③W(1)>W(2)且W(1)>mw(1):mw(1)是A轮船的最优载重量,所以必然mw(1)>=cw(1),则这时w-mw(1)<=cw(2)<=W(2)。B轮船必然能装下剩余的集装箱
④W(1)<W(2)且W(1)=mw(1):同②
⑤W(1)<W(2)且W(1)<mw(1):同③
综上,尽量往哪个轮船装集装箱都是合理的。
-------------------------------------分割线---------------------------
拓展:
有n个重量为wi的集装箱,要装入到m艘轮船,轮船的载重量为Wj,问:能否找到一组装载方案?
好,现在来思考一下这个比较现实的问题,同样先假设是有解的,那么令m艘轮船的当前载重量分别为cw(1)、cw(2)、……、cw(m)
1,附加变量、定量:
cw(i,j):表示第i艘轮船与第j艘轮船的总的当前载重量
mw(i,j):表示第i艘轮船与第j艘轮船的总的最优载重量
2,证明:
(1)当只有3艘轮船A、B、C时,使得其中两艘轮船的当前载重量最优,是合理的
证明:这其实就相当于是将其中两艘轮船融合在一起(但是并不是完全融合,因为还是会有一些能空出来的地方能装东西)
假设轮船A与轮船B的总的当前载重量为cw(1,2),则若更改装载方案,使得mw(1,2)。
这时w-mw(1,2)<=w-cw(1,2)<=cw(3),显然这是合理的
(2)尽量装满载重量大的轮船
证明:而上述的(1)证明中,其实并没有硬性要求轮船A、B的载重量都大于C。那么,可以类似地求解当轮船数为m时的情况。
数学归纳法:
①假设当k=2时,命题成立。根据前面的k=2时的证明可知,k=2时,命题是成立的。
②假设当k=m且m>2时,命题成立。即当k=m时,尽量装满载重量大的轮船时合理的。
当k=m+1且m>2时,由上面的(1)可知,轮船的组合并没有硬性要求。
综上可知,尽量装满载重量大的轮船是合理的。
3,解法思路:
(1)将所有集装箱进行降序排序
(2)将所有轮船按其载重量进行降序排序
(3)用贪心法,逐个逐个将轮船装满
(4)若当所有轮船都遍历完毕时,没有剩余的集装箱则表示有解;否则无解
算法复杂度:
O(n,m) = O(n)+O(m)+O(nm)
算法优化:
在平均情况下进行优化
(1)记录仍未装载的、重量最大的集装箱的下标,一轮结束后直接从该下标开始,减少考虑范围。
(2)构造最优解:令整型数组x[n]中,0表示未装箱,i表示第i个轮船装载了该集装箱
-------------------------------------分割线---------------------------
升级:
有n个重量为wi的集装箱(长宽高分别为a、b、c),要装入到m艘轮船(装箱长宽高分别为A、B、C),轮船的载重量为Wj,问:能否找到一组装载方案?