完全揹包問題

2021-09-26 21:13:06 字數 2431 閱讀 5708

有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...