題目連結:
題目大意:
產品有六種大小 1 × 1 、 2 × 2 、 3 × 3 、 4 × 4 、 5 × 5 以及 6 × 6 的。現在需要將產品裝進箱子裡運送。而箱子的大小統一是 6 × 6 的,一個箱子只要空間允許就可以塞任意數量的產品。
輸入有多列,每列給定兩個非負整數(如果全部為 0 代表輸入結束),代表 1 × 1 ~ 6 × 6 每個大小的產品之數量。試問最少需要幾個箱子才能全數裝箱?
範例輸入:
0 0 4 0 0 1
7 5 1 0 0 0
0 0 0 0 0 3
79 96 94 30 18 14
53 17 12 98 76 54
83 44 47 42 80 3
15 26 13 29 42 40
41 61 36 90 54 66
0 0 0 0 0 0
範例輸出:
2
1
3
86
231
137
115
219
解題思維:
設 1 × 1 、 2 × 2 、 3 × 3 、 4 × 4 、 5 × 5 和 6 × 6 大小的產品之數量依序為 S1 、 S2 、 S3 、 S4 、 S5 、 S6,並將箱子的數量以 X 表示(一開始 X = 0)。
6 × 6 很直觀,你有多少就有多少個箱子。因此將 X 加上 S6 。
5 × 5 也是類似,但是會剩下 36 - 25 = 11 個空間可以給 1 × 1 的(不管你怎麼擺那個 5 × 5 也只能放 1 × 1 的)。所以將 X 加上 S5 ,並將 S1 直接減去 11 × S5(不管夠不夠,先減去就對了。反正不夠的話,箱子的空間也只能空著不能放其他產品)
X 加上 S4 (同上),但是此時會剩下 36 - 16 = 20 單位面積的空間。可以看到將 4 × 4 靠在角落時,可以剛好放入 5 個 2 × 2 或是將其中幾個 2 × 2 改放若干個 1 × 1 。在此先統一放 2 × 2 ,之後多扣的再轉換成對應數量的 1 × 1 。因此 S2 減去 5 × S4。
接著是 3 × 3 ,而 3 × 3 情況比較複雜。因為需要四個 3 × 3 才可以「剛好」放滿 6 × 6 的箱子。因此,「最後」一個箱子可能會有 4 、 3 、 2 或是 1 個 3 × 3 在其中。以下分別討論最後一個箱子的 3 × 3 量,即 S3 ÷ 4 的餘數:
餘數為 0 ,剛好裝滿。沒有多餘的空間可以裝其他大小的產品。
餘數為 1 ,其最佳的放法可以多放額外的 5 個 2 × 2 以及 7 個 1 × 1 的產品。因此 S2 減去 5 、 S1 減去 7 。
餘數為 2 ,其最佳的放法可以多放額外的 3 個 2 × 2 以及 6 個 1 × 1 的產品。因此 S2 減去 3 、 S1 減去 6 。
餘數為 3 ,其最佳的放法可以多放額外的 1 個 2 × 2 以及 5 個 1 × 1 的產品。因此 S2 減去 1 、 S1 減去 5 。
因此 X 加上 S3 ÷ 4 的商數。如果餘數不為 0 ,則 X 要多加 1 。
再來是 2 × 2 的,經歷上面各種減去之後,如果 S2 仍大於 0 ,就需要裝箱。因為前面已經將其他更大的產品裝完了,因此「最後」一個箱子多餘的空間只會有額外的 1 × 1 。
因此 X 要加上 S2 ÷ 9 的商數(9 個 2 × 2 才能剛好裝滿一箱)。如果餘數不等於 0 ,則 X 再加 1 ,且 S1 要減去 36 - (餘數 × 4) 個(因為每個 2 × 2 佔 4 單位面積,所以剩下的才是 1 × 1 能放的)。
但是如果 S2 經歷上面的減去是 < 0 呢?那麼,我們此時可以將每四個 1 × 1 換成一個 2 × 2 的(面積等價)。因此此時 S1 要減去 4 × |S2| 。
最後,如果 S1 仍 > 0 的話,就將 X 加上 S1 ÷ 36 的商數且若餘數 ≠ 0 要將 X 加 1 。此時的 X 值即是所求的最少所需箱子數。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。