我有27塊不同長度從18到48英寸的硬木地板條。我想製作3塊由3排地板組成的木板。兩塊木板必須長60英寸,另一塊木板長72英寸。所有條的總長度足以構建這些木板。很顯然,我可以隨機選擇這些條,將它們粘合起來並剪裁成大小。不過,我想盡量減少浪費量。算法將數字排序成具有特定總和的集合
這個問題可以更簡單地重述爲:我有27個整數,並希望將它們分成9組。 6個集合中的每一個加起來爲60,其餘三個集合中的每一個加起來爲72.這個問題是子集和問題的變化。
我發現一些帖子討論「dynamic programming」但我什麼都不知道這種方法更別說如何代碼吧。
A similar問題被問了一會兒,但討論缺乏。
我的方法是'谷歌方式'。蠻力。計算一切。稍後再分類。所以,
將整數分成9個數字的3個數組。注意有9!/ 3! = 60480分組。
爲每個組計算 每個陣列的總和,稱此爲ArraySum。其中有9個。
(A,B,C,D,E,F,G,H,I)
計算從目標金額(72,60,60)
A-72,B-72,C-72, D-60, E-60,...
加起來所有該組的差異和存儲數之差(稱之爲GroupSum)。這是我想要最小化的數字。
置換ArraySums和目標的款項之間的配對差異給(9!/ 3!= 60480)
現在回去,改變分組和重複。 我得到60480 x 60480 GroupSums = 3657830400
排序groupsums,找到最低的groupsum,選擇該分組。
有沒有比預先計算和排序更好的方法?
呀你是對的。我不必要地使問題複雜化。我應該製作60 + 60 + 72 = 192的超長木板,並將其切割成我需要的長度。這種方式最小的浪費。 – aquagremlin