希望有一个相对简单的方法来做到这一点,这只是我的愚蠢。 我试图找到一个盒子(大小)的组合,它将适合一个更大的特定容量盒子(boxSize)。在代码(下面)中,我现在把它作为geq,这显然不好看,因为通常值大于盒子的承载能力。
boxSize = 9;
size = [5 2 3 7 2 3 5 10 6 4]; % Box size
Nos = [50 20 300 78 22 34 55 120 643 442]; % No things in box
tmpMat = zeros(length(size),2); % Box size and number in there need to be linked
tmpMat(:,1)=size;
tmpMat(:,2)=Nos;
Order = tmpMat(randperm(length(tmpMat)),:); % Randomly sort
boxVector = [];
while(~isempty(Order)>0) % Determine which contributes to box
sumMyBox=cumsum(Order);
sum2=find(sumMyBox(:,1)>=boxSize,1,'first'); % ISSUE here with geq
Used=Order(1:sum2,1);
box = sumMyBox(sum2,:);
boxVector = [boxVector; box];
Order=Order((sum2+1):end,:);
end
简单地制作这个leq的问题在于它只需要一个值,因为2是< 10(例如),而我正在寻找的是将数字相加并使值尽可能接近boxSize。有什么建议?所有编码都在Matlab中。
提前致谢。
答案 0 :(得分:0)
一种可能的解决方案是:
sum2=find(sumMyBox(:,1)>boxSize,1,'first') - 1;
找一个溢出点并备份一个。
在您当前的测试用例中,如果列表中的第10个框是第一个,则答案为no。我可能不完全理解你的任务,但似乎你可能想要计算所有可能的盒子组合。或者,也许,从最大到最小的排序,并采取最适合的盒子,类似的东西。希望我只是不完全理解你要解决的任务。