完全背包问题
#include <iostream>
using namespace std;
int dp[1005][1005]; // dp[i][j]:第i个物品在体积为j时的最大价值
int main() {
int N , V;
cin >> N >> V;
int v[N+1],w[N+1];
for(int i = 1; i <= N; i++) {
cin >> v[i] >> w[i];
}
for(int i = 1; i <= N;i++) {
for(int j = 0; j <= V; j++) {
dp[i][j] = dp[i-1][j];
if(j >= v[i]) {
dp[i][j] = max(dp[i][j],dp[i][j-v[i]]+w[i]);//因为完全背包问题可以重复装入商品,所以转换公式dp[i][j-v[i]]+w[i] 可以重复加入第i个物品
}
}
}
cout << dp[N][V];
return 0;
}
优化版本
#include <iostream>
using namespace std;
int dp[1005]; // dp[j]:当体积为j时的最大价值
int main() {
int N , V;
cin >> N >> V;
int v[N+1],w[N+1];
for(int i = 1; i <= N; i++) {
cin >> v[i] >> w[i];
}
for(int i = 1; i <= N;i++) {
for(int j = v[i]; j <= V; j++) {// 完全背包就可以从v[i]~V了,因为运行重复添加商品
dp[j] = max(dp[j],dp[j-v[i]]+w[i]);
}
}
cout << dp[V];
return 0;
}