問題聲明:從磚塊陣列創建2個等高的柱子
有N塊磚(a1,a2,...,aN)。每塊磚的長度爲L1,L2,...,LN)。使用提供的磚塊製作2個最高平行支柱(相同長度的支柱)。
約束:
- 有N個磚塊。 5 < = N < = 50
- 每塊磚的長度。 1 < = L < = 1000
- 磚塊的長度之和= < 1000磚塊
長度不是在大小順序給出。可能有多塊磚可能具有相同的長度。不是所有的磚都必須用來創建支柱。
實施例:
第一例 -
N = 5
2,3,4,1,6-
可能集合:
(2,6)和(3,4 1)
答:8
我的方法:
尋找2個平行支柱的最大可能長度,即。地板(N/2)。然後,使用DP來查找所有可能使用所有磚塊的總和長度。從儘可能高的總數開始< = floor(N/2),我拿出構成總和的元素的一個子集。然後,再次重複DP方法來查找是否可以使用其餘元素形成相同的和。如果可以形成,那麼輸出是可能的最高總和,否則使用第一個DP,檢查可能形成的下一個最高可能總和,然後再次重複整個過程。
上述方法的問題是,它只檢查一個元素的子集以形成所需的總和。應該檢查所有可能形成所需總和的子集,然後對於每個這些子集使用剩餘的元素,如果可以形成相同的所需總和,則應該檢查它們。麻煩的是在我目前的方法中實現這一點。
第二例 -
N = 6
3,2,6,4,7,1個
可能集合:
(3,2,6)和(7,4)
答案:11
在我的代碼的問題可能依賴於在其中的元件(磚的長度)被給定爲輸入的順序來在這種情況下。有可能第一組是使用元素(3,7,1)= 11形成的,但第二組(2,6,4)不能形成sum = 11。因此,我的代碼開始尋找下一個可能的最大值總和.ie。 10這是錯誤的。
有人可以提出更好的方法或可能改進我目前的做法。
當我考慮使用磚時,可以將它添加到第1柱或第2柱中。如何確定需要選擇哪個支柱。一次只能將磚塊添加到第一個或第二個支柱。那麼,哪塊磚被添加到哪個支柱?或者,我可能不完全清楚你想要解釋什麼。你可以給一些視覺表達(如果可能,在紙上)。 –
或者你是在談論根節點爲(0,0)的樹方法,每個節點有2個子節點,第一個孩子是通過將第一個元素添加到第一個元素來形成的,第一個元素保持原樣,第二個孩子是通過在第二個元素上添加磚並保持第一個磚的原樣而形成的。這種方法的問題是時間和空間的複雜性太高。空間複雜度:O(2^N)[最壞情況:2^50)。我沒有得到你提到的DP方法。 –
我已經添加了一個示例來嘗試和澄清事情。因爲我們只關心一個狀態是否可達,我們可以將它作爲一個大小爲1001x1001的布爾數組來存儲。這不像樹一樣複雜,因爲可能有很多路徑到達同一個狀態。例如,如果我們有三塊大小爲1的磚,我們可以得到(0,0) - >(0,1)(1,0)(0,0) - >(0,2)(1,1)(2,0 )(0,1)(1,0)(0,0)→(0,3)(1,2)(2,1)(3,0)(2,0)(1,1)(0) ,2)(1,0)(0,1)(0,0),事實上這裏在步驟n中有n(n + 1)(n + 2)]/2對,直到我們得到丟棄值> 1000的狀態 – mcdowella