首页 > 其他 > 详细

装载问题,0-1背包

时间:2021-05-23 22:52:56      阅读:17      评论:0      收藏:0      [点我收藏+]

1. 问题

n个集装箱要装上2艘载重量分别为c1和c2的轮船,其中集装箱i的重量为wi,且∑wi <= c1 + c2。问是否有一个合理的装载方案,可将这n个集装箱装上这2艘轮船。如果有,找出一种装载方案。

2. 解析

如果一个给定装载问题有解,则采用下面的策略可得到最优装载方案。
(1)首先将第一艘轮船尽可能装满;
(2)将剩余的集装箱装上第二艘轮船。

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

max∑ wi * xi && ∑ wi * xi <= c1, xi ∈ {0, 1}, 1 <= i <= n;

3. 设计

算法 L o a d i n g ( W , c 1 ) ?;

  S o r t ( W );

  B ← c 1 ; b e s t ← c 1 ; i ← 1 ;

4       while?i ≤ n do

??   if 装入i ii后重量不超过c 1

??    then B ← B ? w i ; x [ i ] ← 1 ; i ← i + 1 ;

??  else x [ i ] ← 0 ; i ← i + 1 ;

   if B <best  

    then记录解; b e s t ← B ;

     Backtrack( i ) ;

   if i = 1

               then return 最优解

           else goto 4.

4. 分析

首先按照物品体积进行排序,调用sort() 函数,其最优时间复杂度为O(n),最差时间复杂度为 O(n logn),平均时间复杂度为O(n logn), 其中按照 贪心策略寻找最优解的 for 语句的时间复杂度为均为 O(n),因此时间复杂度为 O(n+nlogn)。

5. 源码

[github源码地址]

装载问题,0-1背包

原文:https://www.cnblogs.com/zs0618/p/14801783.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!