完全揹包是在n種物品中選取若干件(同一種物品可多次選取)放在空間為v的揹包裡
第i種物品的體積是v,價值是w
求將哪些物品裝入揹包,可使這些物品的總體積不超過揹包容量,且總價值最大
首先看上面這張圖
左邊的黃色縱行代表的是第n件物品
上面的藍灰色橫行代表的是第n件物品的體積和價值
右邊的綠色橫行代表的是揹包容量的大小
—————————————————————————————
分析角度一:
先從揹包的角度來看,揹包體積的選擇範圍是從0~v,但是當揹包體積小於物品體積的時候,這個物品就是不選的,資料跟之前的相同。所以揹包體積的選擇範圍是從v[i] ~ v。
在揹包體積是j的情況下,物品i有選與不選兩種情況,對應以下**:
dp[j]
= math.
max(dp[j]
, dp[j - v[i]
]+ w[i]
);
這時候你有可能會問:不是物品還有多選的情況嗎?為什麼這裡只有選與不選的情況呢?
因為咱是從前往後遍歷的,也就是在揹包體積為j的情況下,j之前的所有資料都是在這個物品選與不選中的最優解,所以到揹包體積為j的之後,有可能之前這個物品已經選過多次了,或是一次都沒選。這裡的選與不選是針對一定體積揹包來說的。
完整**:
public
class
main
}return dp[v];}
}
角度二:
咱再從物品的角度來說,每種物品都有不選與多選的情況
最外層迴圈確定物品是啥(i)
中間迴圈因為從前往後會破壞資料,所以從後往前,具體是如何破壞的,咱也在0-1揹包中說過了。中間迴圈的目的是為了確定揹包的體積(j)
最後一層迴圈是為了確定物品的個數,因為選的個數不能使個數 * 物品體積 > 揹包體積,所以j - k * v[i] >= 0 (k)
所以dp[j]的值就應該在這k個物品放與不放中選擇:
1.不放:就是dp[i]
2.放:這個揹包得騰出k * v[i]的體積來放,同時價值增加了k * w[i]
dp[j]
= math.
max(dp[j]
, dp[j - k * v[i]
]+ k * w[i]
);
完整**:
public
class
main}}
return dp[v];}
}
完全揹包問題 詳細解答
首先完全揹包問題需要01揹包問題做鋪墊,如果讀者01揹包問題沒有解決,一定要理解之後,在看完全揹包問題,包括01揹包的優化 這裡是01揹包 這裡是01揹包的全部優化 好,我們開始完全揹包 有n種物品和乙個容量為v的揹包,每種物品都有無限件可用。第i種物品的體積是v i 價值是val i 求解將哪些物...
揹包問題(完全揹包)
1.矩陣鏈乘法 2.投資組合問題 3.完全揹包問題 4.01揹包問題 5.最長公共子串行 乙個揹包,可以放入n種物品,物品j的重量和價值分別為,如果揹包的最大重量限制是b,怎麼樣選擇放入揹包的物品以使得揹包的總價值最大?組合優化問題,設表示裝入揹包的第j個物品的數量,解可以表示為。那麼目標函式和約束...
完全揹包問題
這個是從ppt上弄過來的。完全揹包問題 有n種物品和乙個容量為v的揹包,每種物品都有無限件可用。放入第i種物品的耗費的空間是ci,得到的價值是wi。求解 將哪些物品裝入揹包,可使這些物品的耗費的空間總和不超過揹包容量,且價值總和最大 基本思路 這個問題非常類似於01揹包問題,所不同的是每種物品有無限...