完全揹包問題
有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
輸出樣例:
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 求解 將哪些物品裝入揹包,可使這些物品的耗 費的費用總和不超過揹包容量,且價值總和最大。基本思路 這個問題非常類似於...