1. 程式人生 > >動態規劃之0-1揹包問題(POJ3624)

動態規劃之0-1揹包問題(POJ3624)

有N件物品和一個容積為M的揹包。第i件物品的體積w[i],價值是d[i]。求解將哪些物品裝入揹包可使價值總和最大。每種物品只有一件,可以選擇放或者不放。(N<=3500,M<=130000)。
解題思路:
用F[i][j]表示取前i種物品,使它們總體積不超過j的最優取法取得的價值總和。
遞推:
F[i][j]=max(F[i-1][j],F[i-1][j-w[i]]+d[i])
取或不取第i種物品,兩者選優(j-w[i]>=0才有第二項)
本題如用記憶型遞迴,需要一個很大的二維陣列,會超記憶體。注意到這個二維陣列的下一行的值,只用到了上一行的正上方及左邊的值,因此可以用滾動陣列的思想,只要一行即可。即可用一維陣列,用“人人為我”遞推型動歸實現。
注意遞推的時候從右向左求一維陣列的值。