我很确定这个简单的问题的名字正确,但是我不知道它是什么。
我有许多不同宽度的块(都是相同的高度)。
我想水平堆叠这些块,以使行的宽度不超过预定义的“最大宽度”常量。如果在任何时候放置新块使行的宽度超过最大宽度,则将其删除并放在新行上。
是否有一种算法可以优化块的堆叠,以使行数最少?
此问题的名称是什么,如何解决?
答案 0 :(得分:1)
这是Java中的一种算法,可以实现所需的功能,尽管您可能必须进行大量调整和编辑。
public static void main(String[] args) {
int maxWidth=100;
int i;
ArrayList<ArrayList<Integer>> serialBlocksData = new ArrayList<>(100);
int temporarySumOfWidth;
temporarySumOfWidth=0;
int currentHorizontalLogOfBlock=0;
for(i=0; i < 100; i++) {
serialBlocksData.add(new ArrayList());
}
for(i=0;(temporarySumOfWidth<maxWidth&¤tHorizontalLogOfBlock<100);i++){
if((temporarySumOfWidth+i)>=maxWidth){
currentHorizontalLogOfBlock=currentHorizontalLogOfBlock+1;
temporarySumOfWidth=0;
serialBlocksData.get(currentHorizontalLogOfBlock).add(i);
temporarySumOfWidth=temporarySumOfWidth+i;
}else{
serialBlocksData.get(currentHorizontalLogOfBlock).add(i);
temporarySumOfWidth=temporarySumOfWidth+i;
}
}
System.out.println(serialBlocksData);
}
这是上面代码的输出。
[[0,1,2,3,4,5,6,7,8,9,10,11,12,13],[14,15,16,17,17,18,19],[20 ,21、22、23],[24、25、26],[27、28、29],[30、31、32] ,[33、34],[35、36],[37、38],[39、40],[41、42],[43、44],[45、46],[47、48],[ 49、50],[51],[52],[53],[54],[55],[56],[57], [58],[59],[60],[61],[62],[63],[64],[65],[66],[67],[68],[69],[70] ],[71],[72],[73],[74],[75],[76],[77],[78],[79], [80],[81],[82],[83],[84],[85],[86],[87],[88],[89],[90],[91],[92] ],[93],[94],[95],[96],[97],[98],[99],[100],[],[] ,[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[ ],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]]
关于如何使这种算法起作用的一些注释
这不是完美的,所以请写下您可能有的任何疑问。