题面:
状态:dp[i][j] 在1 ~ i 间物品之间,给定j的体积时取得的最大价值;
初始化:
if(i == 1){ // 初始化
if(v[i] <= j)dp[i][j] = j / v[i] * w[i]; // 所有的体积都用来装该一件物品,装 j / v[i]件
else dp[i][j] = 0; // 体积不够(可以不单独考虑)
}
状态转移方程:
else if(v[i] > j)dp[i][j] = dp[i - 1][j]; // 当当前物品的体积大于j时,不能装当前的物品
else
dp[i][j] = max(dp[i- 1][j],dp[i][j - v[i]] + w[i]); // 仔细对比与01背包的不同!!!
完整代码:
#include<iostream>
#include<algorithm>
using namespace std;
int v[10001];
int w[100001];
int dp[10000][10000];
int main() {
int N,V;
cin >> N >> V;
for(int i = 1;i <= N;i++){
cin >> v[i] >> w[i];
}
for(int i = 1;i <= N;i++){
for(int j = 1;j <= V;j++){
if(i == 1){ // 初始化
if(v[i] <= j)dp[i][j] = j / v[i] * w[i];
else dp[i][j] = 0;
}
else if(v[i] > j)dp[i][j] = dp[i - 1][j];
else
dp[i][j] = max(dp[i- 1][j],dp[i][j - v[i]] + w[i]);
}
}
cout << dp[N][V] << endl; // 最优解
}