揹包問題2(完全揹包)

2021-06-21 10:18:27 字數 1202 閱讀 4757

問題的提出:有n種物品,乙個容量為v的揹包,每種物品可以無限的加入揹包,第i種物品的價值為v[i]花費為w[i],求將那些裝入揹包能讓價值最大且不超過揹包的容量?

思路:該題類似於01揹包,唯一的不同就是所有的物品可以無限取,這樣從物品的角度考慮就會有多中方法,不像01中的取或不取;當然01揹包作為最基本的揹包問題,所以我們也可以將完全揹包轉化為01揹包來做,按照01揹包思路,我們將f[i][ v]作為選了i種物品放入揹包為v的揹包中最大價值,所以我們得到了這樣的方程:

f[i][v]=max

優化方法:

如果有兩件物品 i, j滿足c[i]<=c[j]且w[i]>=w[j],我們可以將物品j丟棄不考慮,另外的就是去掉大於v的物品,然後就是將一件花費高的物品轉化為多件花費低的物品來比較兩種方法的價值高低,取價值高的那種;

轉換:上面提到01揹包式最簡單的揹包,按道理講應該是揹包都可以轉化為01揹包,其實這個想法是對的,只是有些問題轉化為01揹包不好解罷了!但這個完全揹包轉化為01揹包來解會優化很多;還是01揹包的想法,如果我能將2維陣列轉化為1維陣列,那樣不就優化了很多所以我們得到了下面的**:

for i=1..n

for v=0..v

f[v]=max

是不是覺得這個**可眼熟,是的這個和01揹包的一維陣列優化**很相似,唯一不同的是v是從0到v;為什麼會有這兒順序?我們先從01揹包說起,因為01揹包要求每種物品只可以選一次,所以v從v到0,這是因為要保證第i次迴圈中的狀態f[i][v]是由狀態f[i-1][v-c[i]]遞推而來。換句話說,這正是為了保證每件物品只選一次,保證在考慮「選入第i件物品」這件策略時,依據的是乙個絕無已經選入第i件物品的子結果f[i-1][v-c[i]]。而現在完全揹包的特點恰是每種物品可選無限件,所以在考慮「加選一件第i種物品」這種策略時,卻正需要乙個可能已選入第i種物品的子結果f[i][v-c[i]],所以就可以並且必須採用v=0..v的順序迴圈。這就是這個簡單的程式為何成立的道理。

值得一提的是,上面的偽**中兩層for迴圈的次序可以顛倒。這個結論有可能會帶來演算法時間常數上的優化。

完全揹包問題也是乙個相當基礎的揹包問題,它有兩個狀態轉移方程,分別在「基本思路」以及「o(vn)的演算法「的小節中給出。希望你能夠對這兩個狀態轉移方程都仔細地體會,不僅記住,也要弄明白它們是怎麼得出來的,最好能夠自己想一種得到這些方程的方法。事實上,對每一道動態規劃題目都思考其方程的意義以及如何得來,是加深對動態規劃的理解、提高動態規劃功力的好方法。

揹包問題2 完全揹包

一,題目 有n種物品和乙個容量為v的揹包,每種物品都有無限件可用。第i種物品的費用是c i 價值是w i 求解將哪些物品裝入 揹包可使這些物品的費用總和不超過揹包容量,且價值總和最大。二,基本思路 從每種物品的角度考慮,與它相關的策略已並非取或不取兩種,而是有取0件 取1件 取2件 等很多種。令f ...

揹包問題(完全揹包)

1.矩陣鏈乘法 2.投資組合問題 3.完全揹包問題 4.01揹包問題 5.最長公共子串行 乙個揹包,可以放入n種物品,物品j的重量和價值分別為,如果揹包的最大重量限制是b,怎麼樣選擇放入揹包的物品以使得揹包的總價值最大?組合優化問題,設表示裝入揹包的第j個物品的數量,解可以表示為。那麼目標函式和約束...

揹包問題(0 1揹包 完全揹包)

0 1揹包 有n件物品和乙個容量為v的揹包。第i件物品的費用是c i 價值是w i 求解將哪些物品裝入揹包可使價值總和最大。重要的點在於 每種物品僅有一件,可以選擇放 不放子問題 f i v 表示前i件物品恰好放入乙個 容量為v 的揹包可以獲得的最大價值。狀態轉移方程 遞推式 f i v max 考...