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