使用动态编程的装箱

时间:2012-10-26 14:29:09

标签: algorithm bin-packing

  

问题陈述:您有n1个大小为s1的项目,n2个大小为s2的项目,以及n3个大小为s3的项目。您希望将所有这些物品装入每个容量为C的容器中,以便最大限度地减少使用的垃圾箱总数。

我的解决方案:

Bin(C,N1,N2,N3) = max{Bin(C-N1,N1-1,N2,N3)+N1 if N1<=C and N1>0,
                      Bin(C-N2,N1,N2-1,N3)+N2 if N2<=C and N2>0,
                      Bin(C-N3,N1,N2,N3-1)+N3 if N3<=C and N3>0,
                      0 otherwise}

上述解决方案仅有效填充单个箱柜。任何人都可以建议如何修改上述关系,以便获得用于有效包装物品的总箱数?

1 个答案:

答案 0 :(得分:0)

<强>问题 您有n1个大小为s1的项目和n2个大小为s2的项目。您必须将所有这些物品装入容器C中的每个容器中,以便最大限度地减少使用的容器总数。为这种包装设计多项式时间算法。

以下是我对此问题的解决方案,它与您提出的问题非常相似。

DP方法 假设Bin(i,j)给出最小的二进制数,然后Bin(i,j)= min {Bin(i',j')+ Bin(i - i',j - j')}其中i + j&gt;我'+ j'&gt; 0.将有n ^ 2 - 2个不同的(i',j')组合和一对(n1,n2)组合。所以复杂性大约是O(n ^ 2)。

<强>复杂性 为O(n ^ 2)

实施例: 设s1 = 3,n1 = 2,s2 = 2,n2 = 2,C = 4.找到所需的最小容器,即b。

<pre>
i j b
- - -
0 1 1
0 2 2
1 0 1
1 1 1
1 2 2
2 0 2
2 1 3
2 2 3  -> (n1,n2) pair
</pre>

你可以看到,需要3个箱子。

<pre>
Note that Bin(2,2) = min{
  Bin(2,1) + Bin(0,1), 
  Bin(2,0) + Bin(0,2),
  Bin(1,2) + Bin(1,0),
  Bin(1,1) + Bin(1,1)} 
= min{3, 4} 
= 3
</pre>