和01揹包問題的區別:
01揹包問題:1件物品只能選或者不選
完全揹包問題:1件物品可以重複選多次,只要不超過總體積
題目:
問題:有n件物品和乙個容量是v的揹包。
第i件物品的體積是vi,價值是wi。
求解將哪些物品裝入揹包,可使這些物品的總體積不超過揹包的容量,且價值最大。
輸入格式
第一行有兩個整數,n,v用空格隔開,分別表示物品數量和揹包容積。
接下來有n行,每行兩個整數vi,wi,用空格隔開,分別表示第i件物品的體積和價值。
輸出格式
輸出乙個整數,表示最大價值
資料範圍
0輸入樣例
4 51 2
2 43 4
4 5輸出樣例
10分析思路:
f[i]:表示總體積是i的情況下,最大價值是多少
f[0…m]列舉,m表示揹包容量
result=max
01揹包從大到小列舉->保證每個物品只用1次
從前往後考慮
for(int i=0;i
(由於j正序,f[j-kv[i]]為前i-1個物品的值,f[j-k*v[i]-v[i]]為前i個物品的值).
最後會傳遞到max處。
因為f[v[i]]一定正確(2中已假設前i-1個物品中的f[j]全都正確),f[0]一定正確=0,w[i]一定正確,所max
一定正確=>f[j-k*v[i]]一定正確=>f[j]一定正確.
時間複雜度:1000000
**:
#include
#include
#include
using
namespace std;
const
int n=
1010
;int n,m;
int f[n]
;int
main()
/*初始化的時候把所有的 f[i]都初始化為0
/f[m] 表示體積 小於等於m的情況下 ,所有方法裡面
/轉移的時候不一定是從f[0]轉移過來的,可以從任意乙個狀態轉移
/當用不完整個揹包的容量的時候 ,假設剩k容量就可以從k轉移
/則一定可以列舉到 最優解一樣的選法 ,因為體積變成了一樣的
/假設最優解用了m-k的體積,f[m]就一定可以從k開始列舉 ,也只用了 m-k的體積
也會列舉到最優解 ,所以f[m]表示的就是體積小於等於 m的情況下的最優解 */
cout<
<
//最大價值(不需要列舉從0到m)
若題目問體積恰好為m的情況下,最大價值為多少?
除f[0]=0
在初始化時所有f[i]初始化為負無窮
九大揹包問題專題 分組揹包問題
問題 有n組物品和乙個容量是v的揹包。第組物品有若干個,同一組內的物品最多只能選乙個每件物品的體積是vij,價值是wij。其中i是組號,j是組內編號。求解將哪些物品裝入揹包,可使這些物品的總體積不超過揹包的容量,且價值總和最大。輸出最大價值 輸入格式 第一行有兩個整數,n,v用空格隔開,分別表示物品...
揹包問題(完全揹包)
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 考...