さまざまな寸法の長方形のリストがあります。
rects = [100x20, 30x10, 10x10, 70x20, 40x30, 50x10]
これらの長方形からテーブルをレンダリングしようとしています。列の数が決まっている場合は、次のように行数と各行と列のサイズを計算できます。
numCols = 4;
for (i = 0; i < rects.size - 1, i++):
rect = rects[i];
col = i % numCols;
row = floor(i / numCols);
columns[col] = max(columns[col], rect.width);
rows[row] = max(rows[row], rect.height);
end for;
ここで、テーブルを最大行幅で構成する必要があります。列の数は、最適な行幅の実行時の計算によって異なります。
上記のリストと140に設定された最大行を使用すると、テーブルは次のようになります。
rects = [100x20, 30x10, 70x10, 10x20, 40x30, 10x10]
100x20, 30x10
70x10, 10x20
40x30, 10x10
cols = [100, 30]
rows = [20, 20, 30]
この状況にアプローチするための私の最初のアイデアは、可能な列の数ごとに最大列幅をキャッシュすることです。合計<=最大行幅の最後のエントリが優先されます。
max[1] = [100]
max[2] = [100, 30] - wins
max[3] = [100, 40, 70] - 210 > 140
max[4] = [100, 30, 70, 10]
max[5] = [100, 30, 70, 10, 40]
max[6] = [100, 30, 70, 10, 40, 10]
残念ながら、可能な列番号ごとに最大でエントリを作成する必要があります。リストはかなり大きくなる可能性があります。誰かがこの最適化問題を解決するためのアルゴリズムを知っていますか?