cpp
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1005;
int N, V;
int w[MAXN], v[MAXN];
int dp[MAXN][MAXN];
int main() {
cin >> N >> V;
for (int i = 1; i <= N; ++i) {
cin >> w[i] >> v[i];
}
for (int i = 1; i <= N; ++i) {
for (int j = V; j >= 1; --j) {
if (j >= w[i]) {
dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - w[i]] + v[i]);
} else {
dp[i][j] = dp[i - 1][j];
}
}
}
cout << dp[N][V] << endl;
return 0;
}
解释:
w
和v
数组分别表示每个物品的重量和价值。dp[i][j]
表示前i
个物品在背包容量为j
的情况下的最大价值。- 状态转移方程:
dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - w[i]] + v[i])
,即选择当前物品或不选择当前物品。 - 循环遍历每一个物品和每一个背包容量,计算出最大价值。
- 输出
dp[N][V]
即为答案。