我有一个数组,其中包含不同大小的材料列表:{4,3,4,1,7,8}
。但是,该箱子最多可容纳 10 号材料。我需要找出包装数组中所有元素所需的最小箱子数量。
对于上面的数组,你可以打包成 3 个 bin,并按如下方式划分它们:{4,4,1}
, {3,7}
, {8}
。还有其他可能的布置也适合三个库存管,但不能用更少的数量来完成
我试图通过递归来解决这个问题,以便更好地理解它。
我在用thisDP 配方(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 个元素,它就会变得非常慢——求解包含 8 个元素的数组大约需要 25 秒你能告诉我算法是否有问题吗?我不需要替代解决方案 ---只需要知道为什么这么慢,以及如何改进
这是我用 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);
}
}