dp 學習(二) 01揹包問題

2021-10-17 21:23:28 字數 2968 閱讀 2744

01揹包問題

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

輸出樣例:

8
分析:

走出題目問題,考慮在面對第 i 件物品,揹包容量為 j 時的最值情況:

(首先給出物品是按容量和**從小到大排的,在每件物品只能用一次的情況下優先考慮價值更大的)

1.在考慮第0件物品,揹包容量為0時,此時最大價值為0。

2.當只考慮第一件物品時,有兩種情況(揹包能裝下,揹包裝不下),當揹包容量小於該物體容量時候揹包裝不下,最大價值還是等於0。反之可以裝下,最大價值等於該物品的價值。

3.當只考慮第二件物品時,如果揹包裝不下第二件物品,此時揹包中最大價值分析同(2),反之,揹包可以裝下第二件物品,此時揹包中的價值為第二件物品的價值加上剩餘容量可以裝的價值,而剩餘容量分析同(2)。這時揹包的最大價值為是否裝第二件物品時兩種情況的最大值。

4.當考慮第 i 件物品時,如果揹包裝不下,此時揹包的最大價值同隻考慮前 i-1 件物品,反之,揹包可以裝下第 i 件物品,此時揹包價值為第i件物品的價值加上剩餘容量可裝的最大值。這時揹包價值為是否裝第 i 件物品兩種情況的最大值。

題解:

dp[i][j]:在考慮第i件物品,揹包容量為j時的最大值。

v[i]:第i件物品的價值。

w[i]:第i件物品的體積。

關鍵:

當揹包裝不下第 i 件物品時(j=w[i]):要判斷此時裝第 i 件物品時價值大還是不裝第i件物品時價值大

dp[i][j] = max(dp[i-1][j] ,dp[i-1][j-w[i]] + v[i])

(不選該物品是時揹包價值:dp[i-1][j],選該物品時揹包價值:dp[i-1][j-w[i]] + v[i])

**如下:

c++:

1. 二維陣列+動態規劃:

#include

#include

using

namespace std;

const

int m =

1001

;int dp[m]

[m],w[m]

,v[m]

;int

main()

for(

int i =

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

cout << dp[n]

[v];

return0;

}

2.優化:一維陣列+動態規劃:

在優化二位陣列時做其等價變換就行了。

#include

#include

using

namespace std;

const

int m =

1001

;int dp[m]

,w[m]

,v[m]

;int

main()

for(

int i =

1; i <= n; i++

) cout << dp[v]

;return0;

}

python:

n,v =

map(

int,

input()

.split())

w =[

]v =

dp =[[

0]*(v+1)

for i in

range

(n+1)]

for i in

range

(n):

s =list

(map

(int

,input()

.split())

)0])

1])for i in

range(1

,n+1):

for j in

range

(v+1):

dp[i]

[j]= dp[i -1]

[j]if j>=w[i-1]

: dp[i]

[j]=

max(dp[i -1]

[j], dp[i -1]

[j - w[i-1]

]+ v[i-1]

)print

(dp[n]

[v])

01揹包問題 dp

這道題需要從定義去理解 dp i 1 j 定義為 在前i個物品裡面選出來的總體積不大於j的最大的價值 所以這樣就可以知道了,dp i 1 j 就表示在前i個物體裡面選出來的不超過給定體積的最大價值了 所以清楚定義後就有 如果當前超過了當前體積了 那麼他肯定就是dp i 1 j dp i j 了 如果...

01揹包問題(dp)

思路 填表。以下有幾種情況 情況一 第j件放不進去 當前容量i小於第i件物品 這時所得價值為 dp i j dp i j 1 情況二 第j件不放進去 容量足夠 這時所得價值為 dp i j dp i j 1 情況三 第j件放進去 容量足夠 這時所得價值為 dp i weigh j j 1 value...

01揹包問題 DP

有 n件物品和乙個容量是 v 的揹包。每件物品只能使用一次。第 i件物品的體積是 vi,價值是 wi。求解將哪些物品裝入揹包,可使這些物品的總體積不超過揹包容量,且總價值最大。輸出最大價值。第一行兩個整數,n,v,用空格隔開,分別表示物品數量和揹包容積。接下來有 n 行,每行兩個整數 vi,wi,用...