dp 學習(三) 完全揹包問題

2021-10-18 22:42:04 字數 2317 閱讀 2736

完全揹包問題

n種物品和乙個容量是v的揹包,每種物品都有無限件可用

i種物品的體積是vi,價值是wi

求解將哪些物品裝入揹包,可使這些物品的總體積不超過揹包容量,且總價值最大。

輸出最大價值。

輸入格式

第一行兩個整數,nv,用空格隔開,分別表示物品種數和揹包容積。

接下來有n行,每行兩個整數vi,wi,用空格隔開,分別表示第i種物品的體積和價值

輸出格式

輸出乙個整數,表示最大價值。

資料範圍

0<n,v≤1000

0<vi,wi≤1000

輸入樣例

4 5

1 22 4

3 44 5

輸出樣例:

10

**:c++:

1.由01揹包問題延伸的直接做法(缺點:時間複雜度高)

#include

#include

using

namespace std;

const

int n =

1005

;int v[n]

, w[n]

,dp[n]

[n];

int n,y;

intmain()

for(

int i =

1;i <= n;i++)}

cout << dp[n]

[y];

return0;

}

2.對時間進行優化:

將該式子進行優化:

for

(int k=

0;j-k*v[i]

>=

0;k++

) dp[i]

[j]=

max(dp[i-1]

[j], dp[i-1]

[j - k*v[i]

]+ k*w[i]

);

優化為:(歸納化簡)

if

(j>=v[i]

) dp[i]

[j]=

max(dp[i]

[j], dp[i]

[j - v[i]

]+ w[i]

);

**:

#include

#include

using

namespace std;

const

int n =

1005

;int v[n]

, w[n]

,dp[n]

[n];

int n,y;

intmain()

for(

int i =

1;i <= n;i++)}

cout << dp[n]

[y];

return0;

}

3.對時間和空間都進行優化(在2的基礎上等價變換為一維陣列)

#include

#include

using

namespace std;

const

int n =

1005

;int v[n]

, w[n]

, dp[n]

;int n, y;

intmain()

for(

int i =

1;i <= n;i++)}

cout << dp[y]

;return0;

}

DP之完全揹包問題

such as 設有n種物品,每種物品有乙個重量及乙個價值。但每種物品的數量是無限的,同時有乙個揹包,最大載重量為m,今從n種物品中選取若干件 同一種物品可以多次選取 使其重量的和小於等於m,而價值的和為最大。對於這個問題,啊,還是直接上 吧,在 中理解,解一 只需在01揹包上稍稍改善以下就行 in...

完全揹包問題講解(dp)

此題之前先分析兩種常見的揹包問題,01揹包與完全揹包 01揹包 在m件物品中取出若干件物品放到揹包中,每件物品對應的體積v1,v2,v3,對應的價值為w1,w2,w3,每件物品之多拿一件。解決方案 考慮用動態規劃的方法來解決,這裡的 階段是 在前n件物品中,選取若干件物品放入揹包中 狀態是 在前n件...

完全揹包dp

完全揹包類似題目 不過求最小值 杭電1114 揹包九講 基本形式 有 n 種物品和乙個容量為 v 的揹包,每種物品都有無限件可用。放入第 i 種 物品的費用是 c i 價值是 w i 求解 將哪些物品裝入揹包,可使這些物品的耗 費的費用總和不超過揹包容量,且價值總和最大。基本思路 這個問題非常類似於...