有n個重量和價值分別為wi,vi的物品,從這些物品中挑選出總重量不超過w的物品,求所有挑選方案中價值總和的最大值
1≤n≤100
1≤wi,vi≤100
1≤w≤10000
其實這個問題01揹包問題的區別在與,這裡的每個物品都是可以重複取的。而01揹包問題就只能取一次;
在原01揹包問題中:
遞推式為:dp [ i ] [ j ] = max( dp[ i-1 ] [ j - weight [ i ] ] + value [ i ] , dp[ i-1 ] [ j ] )
式子的含義為 : 當我揹包的容量為j時,我是否取第i個物品
(1)如果取: **dp[ i-1 ] [ j - weight [ i ] ] + value [ i ]** :
揹包要放入物品 **i** , 那麼揹包必須有容納得下 **i** 物品的空間 ,
所以前一狀態揹包用量有 :**[ j - weight [ i ] ]** ,
既然我的物品只能取一次,所以 **[ i - 1 ]** (過度回取第 i- 1 號物品 的情況,保證i 號物品 只被取一次), 才有此式子。
(2) 如果不取,那麼就是直接返回前狀態 : dp[ i-1 ] [ j ]
那麼ok, 我們現在想一想,如果我可以反覆取 i 號物品(在容量j 允許的情況下) ,
那麼如果我取了 i 號物品 一次後, 我就不需要過度回 取 i- 1 號物品的 狀態了 。
因為假設取了一次之後,揹包容量還可以再一次納入此物品,那麼 只需要在我取了第一次的基礎上,在加一次就ok 啦。而第一次取得記錄已經被記錄入 dp [ i ] [ j - weight [ i ] ] + value[ i ] (為什麼不是i-1??? -----已經說了:可以多次取,不需要過度回 i-1 的狀態來保證只取一次)了。
所以 最 終 結 論完全揹包問題的 遞 推 式 :
dp[ i ] [ j - weight [ i ] ] + value [ i ] , dp[ i-1 ] [ j ]物品
價值重量
物品14
3物品254
物品33
2容量vol = 7;
(直接跳到允許放入的時候)
1) dp [ 1 ] [ 3 ] = max( dp[ i ] [ 3-3 ] + value [ 1 ] , dp [ 0 ] [ 3 ] )
==> dp [1] [3] = max ( 0 + 4 , 0)
2)dp [ 1 ] [ 4 ] = max( dp[ 1 ] [ 4-3 ] + value [ 1 ] , dp [ 0 ] [ 4 ] )
==> dp [1]\ [4] = max ( 0 + 4 , 0)
3)dp [ 1 ] [ 5 ] = max( dp[ 1 ] [ 5-3 ] + value [ 1 ] , dp [ 0 ] [ 5 ] )
==> dp [1] [5] = max ( 0 + 4 , 0)
!!!重點來了
4)dp [ 1 ] [ 6 ] = max( dp[ 1 ] [ 6-3 ] + value [ 1 ] , dp [ 0 ] [ 6 ] )
dp [ 1 ] [ 6 ] = max( dp[ 1 ] [ 3 ] + value [ 1 ] , dp [ 0 ] [ 6 ] )
==> dp [1] [6] = max ( 4 + 4 , 0)
!!是不是在原來已經放了物品1的基礎上又放了物品!!
如果是01揹包問題就是:
dp [ 1 ] [ 6 ] = max( dp[ 1-1 ] [ 6-3 ] + value [ 1 ] , dp [ 0 ] [ 6 ] )
dp [ 1 ] [ 6 ] = max( dp[ 0 ] [ 3 ] + value [ 1 ] , dp [ 0 ] [ 6 ] )
==> dp [1] [6] = max(0 + 4 , 0)
">#include using namespace std;
int main()
; int weight[n]=;
int dp[10][10] =;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
cin>>vol;
for(int i=1;i<=n;i++)
else
} }
for(int i=1;i<=n;i++)
cout<<"\n";
} cout<
揹包問題(完全揹包)
1.矩陣鏈乘法 2.投資組合問題 3.完全揹包問題 4.01揹包問題 5.最長公共子串行 乙個揹包,可以放入n種物品,物品j的重量和價值分別為,如果揹包的最大重量限制是b,怎麼樣選擇放入揹包的物品以使得揹包的總價值最大?組合優化問題,設表示裝入揹包的第j個物品的數量,解可以表示為。那麼目標函式和約束...
完全揹包問題
這個是從ppt上弄過來的。完全揹包問題 有n種物品和乙個容量為v的揹包,每種物品都有無限件可用。放入第i種物品的耗費的空間是ci,得到的價值是wi。求解 將哪些物品裝入揹包,可使這些物品的耗費的空間總和不超過揹包容量,且價值總和最大 基本思路 這個問題非常類似於01揹包問題,所不同的是每種物品有無限...
完全揹包問題
設有n種物品,每種物品有乙個重量及乙個價值。但每種物品的數量是無限的,同時有乙個揹包,最大載重量為m,今從n種物品中選取若干件 用乙個物品可以多次選取 使其重量的和小於等於m,而價值的和為最大。輸入有多組資料,對於每組輸入資料第1行 兩個整數,m 揹包容量,m 200 和n 物品數量,n 30 第2...