装箱问题(NP问题)

35 篇文章 0 订阅
24 篇文章 0 订阅

问题描述

有n个物品,体积为 v[i],i = 1..n。 现在有若干同样的箱子,体积为C,C > v[i], i = 1..n。问最少需要多少箱子,才能装下所有的物品。

问题求解

这类问题是NP问题,即可以在多项式时间内验证一个解是否OK,但是不可以在多项式时间内求得该解。
装箱问题,有个近似解。

First Fit (FF)

首次适应解法。对于物品 i ,从当前装了物品的箱子中找到首个,其剩余容量可以放下物品 i 的箱子,如果该箱不存在,那么就放入到新箱子中。显然最多需要 n 个箱子即可。时间复杂度为 O(n^2),当然,通过 tournament tree 可以将时间复杂度将为 O (n log n)。

tournament tree,为一棵完全树,所有的叶节点为箱子,每个内部节点 v ,保存一个属性 : v.max,记录以该节点为根的所有叶节点中,最大的剩余容量。
因此当要放入物品 i 的时候,其容量为 v[i],那么针对tournament tree的根节点开始,如果 root->left_child.max >= v[i],那么递归给左子树去解决问题,放置物品 i ,否则递归到右子树。
当某个叶节点(箱子)放入物品 i 的时候,其 v.max 减去 v[i]。那么递归更新该叶节点的ancestor (祖先节点)。
可以看到,每次放置一个物品 i 的时候,其时间复杂度为 O(log n),因此总的时间复杂度为 O(n log n)。

FFD

降序首次适应(FFD)算法。上述的First Fit 是一种在线算法。即每次可以在线地直接接受物品 i 作为输入,然后根据一种策略放置物品 i 。而降序首次适应算法(FFD)则是离线地接收完所有的物品,对这些物品按体积从大到小进行排序。之后还是使用FF算法。复杂度同样,也是 O( n log n)。

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值