例題 裝箱問題

2021-07-13 14:14:29 字數 1699 閱讀 6039

問題描述

乙個工廠製造的產品形狀都是長方體,它們的高度都是h,長和寬都相等,一共有6個型號,它們的長度和寬度分別是1x1,2x2,3x3,4x4,5x5,6x6。這些產品通常使用乙個6x6xh的長方體包裹包裝,然後郵寄給客戶。因為郵費很貴,所以工廠要想方設法地減少每個訂單運送時的包裹數量。他們需要有乙個好的程式以解決這個問題從而節省費用。現在這個程式由你來設計。

輸入資料

輸入檔案包括幾行,每一行代表乙個訂單。每個訂單裡的一行包括6個整數,中間用空格隔開,分別為1x1至6x6這6種產品的數量。輸入檔案將6個0組成的一行結尾。

輸出要求

除了輸入一行6個0以外,輸入檔案裡每一行對應著輸出檔案的一行,每一行輸出乙個整數代表對應的訂單所需的最小包裹數。

輸入樣例

0 0 4 0 0 1

7 5 1 0 0 0

0 0 0 0 0 0

輸出樣例

解題思路

這個問題描述得比較清楚,在這裡只解釋一下輸入輸出樣例:共兩組有效輸入,第一組表示有4

個3x3的產品和1個6x6的產品,此時4個3x3的產品占用乙個箱子,另外1個6x6的產品占用乙個箱子,所以箱子數是2;第二組表示有7個1x1的產品,5個2x2的產品和1個3x3的產品,可以把它們統統放在乙個箱子中,所以輸出是1。

分析6個型號的產品占用箱子的具體情況如下:6x6的產品每個會占用乙個完整的箱子,並且沒有空餘的空間;5x5的產品每個占用乙個新的箱子,並且留下11個可以盛放1x1的產品的空餘空間;4x4的產品每個占用乙個新箱子,並且留下5個可以盛放2x2的產品的空餘空間;3x3的產品比較複雜,首先3x3的產品不能放在原來盛放5x5或者4x4的箱子中,那麼必須為3x3的產品另開新的箱子,新開的箱子數目等於3x3的產品的數目除以4向上取整;同時需要討論為3x3的產品新開箱子時,剩餘的空間可以盛放多少2x2和1x1的產品(這裡如果空間可以盛放2x2的產品,就將它記入2x2的空餘空間,等到2x2的產品全部裝完,如果還有2x2的空間剩餘,再將它們轉換成1x1的剩餘空間)。分情況討論為3x3的產品開啟的新箱子額中剩餘的空位,共為4種情況:第一種,3x3的產品的數目正好是4的倍數,所以沒有空餘空間;第2種,3x3的產品數目是4的倍數加1,這時還剩5個2x2的空位和7個1x1的空位;第3種,3x3的產品數目是4的倍數加2,這時還剩3個2x2的空位和6個1x1的空位;第4種,3x3的產品的數目是4的倍數加3,這時還剩1個2x2的空位和5個1x1的空位;處理完3x3的產品,就可以比較一下剩餘的2x2的空位和2x2產品的數目,如果產品數目多,就將2x2的空位全部填滿,再為2x2的產品開啟新箱子,同時計算新箱子中1x1的空位,如果剩餘空位多,就將2x2的產品全部填入2x2的空位,再將剩餘的2x2空位轉換成1x1的空位;最後處理1x1的產品,比較一下1x1的空位與1x1的產品數目,如果空位多,將1x1的產品全部填入空位,否則,先將1x1的空位填滿,然後再為1x1的產品開啟新的箱子。

參考程式:

#include

void main()

;while(1)

}

實現中常見的問題:

問題一:計算邏輯沒有想清楚,造成計算出錯;

問題二:沒有輸入一組輸出一組,而是試圖將所有輸入都儲存起來,計算後一起輸出,但題目中並沒有給出到底有多少組輸入資料,所以有可能因為陣列開設得太小而出現執行錯誤;

問題三:輸入語句使用不正確,造成死迴圈,表現為output limit exceeded 錯誤。

問題A 裝箱問題

思路 思路 根據演算法筆記上01揹包問題的一維形式改編,就僅僅是把每件物品的價值改為1,再未做其他修改,後來發現不行 const int maxn 1001 int dp maxn int w maxn int main for int i 0 i參照別人的答案,進行的思考 首先,狀態轉移方程 dp...

Codeup 問題 A 裝箱問題

問題描述 有乙個箱子的容量為v v為正整數,且滿足0 v 20000 同時有n件物品 0的體積值為正整數。要求從n件物品中,選取若干裝入箱內,使箱子的剩餘空間最小。輸入 1行整數,第1個數表示箱子的容量,第2個數表示有n件物品,後面n個數分別表示這n件 物品各自的體積。輸出 1個整數,表示箱子剩餘空...

練習 問題 A 裝箱問題

問題描述 有乙個箱子的容量為v v為正整數,且滿足0 v 20000 同時有n件物品 0的體積值為正整數。要求從n件物品中,選取若干裝入箱內,使箱子的剩餘空間最小。輸入 1行整數,第1個數表示箱子的容量,第2個數表示有n件物品,後面n個數分別表示這n件 物品各自的體積。輸出 1個整數,表示箱子剩餘空...