【发布时间】:2011-11-29 12:03:30
【问题描述】:
我有一个包含不同尺寸材料列表的数组:{4,3,4,1,7,8}。但是,bin 最多可以容纳 10 大小的材料。我需要找出包装数组中所有元素所需的最小 bin 数量。
对于上面的数组,你可以打包成 3 个 bin 并按如下方式划分:{4,4,1}, {3,7}, {8}。还有其他可能的安排也适合三个库存管道,但不能用更少的方式完成
我正在尝试通过递归来解决这个问题,以便更好地理解它。
我正在使用this DP 公式(pdf 文件的第 20 页)
考虑一个输入 (n1;:::;nk),其中 n = ∑nj 个项目
确定可以打包到单个 bin 中的 k 元组(输入的子集)的集合
即 OPT(q1;:::;qk) = 1 的所有元组 (q1;:::;qk)
用 Q 表示这个集合 对于每个 k 元组 q ,我们有 OPT(q) = 1
使用递归计算剩余值: OPT(i1;:::;ik) = 1 + minOPT(i1 - q1;:::;ik - qk)
我已经编写了代码,它适用于小数据集。但是如果将数组的大小增加到超过 6 个元素,它会变得非常慢 -- 需要大约 25 秒来解决包含 8 个元素的数组 你能告诉我算法是否有问题吗?我不需要替代解决方案 --- 只需要知道为什么这么慢,以及如何改进它
这是我用 C++ 编写的代码:
void recCutStock(Vector<int> & requests, int numStocks)
{
if (requests.size() == 0)
{
if(numStocks <= minSize)
{
minSize = numStocks;
}
// cout<<"GOT A RESULT : "<<numStocks<<endl;
return ;
}
else
{
if(numStocks+1 < minSize) //minSize is a global variable initialized with a big val
{
Vector<int> temp ; Vector<Vector<int> > posBins;
getBins(requests, temp, 0 , posBins); // 2-d array(stored in posBins) containing all possible single bin formations
for(int i =0; i < posBins.size(); i++)
{
Vector<int> subResult;
reqMinusPos(requests, subResult, posBins[i]); // subtracts the initial request array from the subArray
//displayArr(subResult);
recCutStock(subResult, numStocks+1);
}
}
else return;
}
}
getBins函数如下:
void getBins(Vector<int> & requests, Vector<int> current, int index, Vector<Vector<int> > & bins)
{
if (index == requests.size())
{
if(sum(current,requests) <= stockLength && sum(current, requests)>0 )
{
bins.add(current);
// printBins(current,requests);
}
return ;
}
else
{
getBins(requests, current, index+1 , bins);
current.add(index);
getBins(requests, current, index+1 , bins);
}
}
【问题讨论】:
-
你的代码和描述是如何对应的?在 cmets 中解释每个变量的含义以及函数应该做什么。对于任何试图调查的人来说,一个独立的可编译示例会很好。另一方面,链接源声明了 O(n^(2k)) 的复杂度,其中 n 是项目的数量,k 是不同大小的数量(iiuc )。例如,有 8 个项目和 6 种不同的尺寸,这是大量计算。
-
如果你想让别人浏览你的代码,至少让它可读。使用这种格式没有人会帮助你,这是一团糟。
标签: algorithm recursion bin packing