1. 物品無限揹包問題.
有n種物品, 每種都有無窮多個, 第i種物品體積為vi, 重量為wi. 選一些物品裝到乙個容量為c的揹包裡, 使得揹包內物品總體積不超過c的前提下重量盡量大.1[分析] 帶權的dag最長路徑問題, 把**中的+1改為+w[i]即可.
2. 0-1揹包問題
只憑"剩餘體積"這個狀態, 無法得知該物體是否被用過.
這裡引入"多階段決策的最優化": 用d(i,j)表示當前在第i層, 剩餘容量為j時接下來的最大重量和.
則d(i,j)=max, i>n時d(i,j) = 0, j<0時負無窮.
for ( int i = n; i >= 1; i-- )運算過程示意:}
答案就在右下角d[0][c].
簡化空間占用: 滾動陣列
現在每次迴圈只用到2維表中的後兩行資料, 而且第 i 行第 j 個資料只依賴第 i-1行中小於 j 的資料, 所以改一下內層迴圈的順序就可以把二維陣列簡化成一維陣列.
tip:
在遞推演算法中, 如果計算順序很特殊, 而且計算新狀態所用到的原狀態不多, 可以嘗試使用滾動陣列減少記憶體開銷.
不過在使用滾動陣列後, 解的列印變的困難了, 所以在需要列印方案甚至要求字典序的最小方案的場合, 應慎用滾動陣列.
只要稍微改動一下**~
for ( int i = n; i >=0; i-- )printf("\n");
}
動態規劃之01揹包問題
首先是問題描述 給定n種物品和一揹包,物品i的重量是wi,其價值是pi,揹包的容量是m,問如何選擇裝入揹包中的物品總價值最大?可以這樣理解 揹包的揹負有上限,因此在這個上限內盡可能多的裝東西,並且價值越多越好。在這裡我之想討論動態規劃解決這個問題的詳細過程。動態規劃是用空間換時間的一種方法的抽象。其...
動態規劃之0 1揹包問題
問題描述 現有n件物品和乙個容量為c的揹包。第i件物品的重量是重量為w i 價值是v i 已知對於一件物品必須選擇取 用1表示 或者不取 用0表示 且每件物品只能被取一次 這就是 0 1 的含義 求放置哪些物品進揹包,可使這些物品的重量總和不超過揹包容量,且價值總和最大。求解思路 0 1揹包問題的遞...
動態規劃之0 1揹包問題
問題描述 0 1揹包問題是應用動態規劃設計求解的典型例題 已知n種物品和乙個可容納c重量的揹包,物品i的重量為w i 產生的效益為p i 在裝包時物品i可以裝入,也可以不裝,但不可拆開裝。問如何裝包,所得裝包總效益最大。演算法分析 最優子結構特性 0 1揹包的最優解具有最優子結構特性。與一般揹包問題...