有N件物品和一個容量是V的揹包。每件物品只能使用一次。
第i件物品的體積是 vi,價值是 wi。
求解將哪些物品裝入揹包,可使這些物品的總體積不超過揹包容量,且總價值最大。
輸出最大價值。
輸入格式
第一行兩個整數,N,VN,V,用空格隔開,分別表示物品數量和揹包容積。
接下來有 NN 行,每行兩個整數 vi,wivi,wi,用空格隔開,分別表示第 ii 件物品的體積和價值。
輸出格式
輸出一個整數,表示最大價值。
數據範圍
0<N,V≤10000<N,V≤1000
0<vi,wi≤10000<vi,wi≤1000
輸入樣例
4 5
1 2
2 4
3 4
4 5
輸出樣例:
8
#include<iostream> #include<algorithm> using namespace std; const int MAXN = 1005; int w[MAXN]; // 重量 int v[MAXN]; // 價值 int f[MAXN][MAXN]; // f[i][j], j重量下前i個物品的最大價值 int main() { int n, m; cin >> n >> m; for(int i = 1; i <= n; ++i) cin >> w[i] >> v[i]; for(int i = 1; i <= n; ++i) for(int j = 1; j <= m; ++j) { // 當前重量裝不進,價值等於前i-1個物品 if(j < w[i]) f[i][j] = f[i-1][j]; // 能裝,需判斷 else f[i][j] = max(f[i-1][j], f[i-1][j-w[i]] + v[i]); } cout << f[n][m]; return 0; }