背包问题
01背包
相关题目
int package01(const vector<vector<int>>& things,const int volume,const int n) {
vector<vector<int>> dp(n + 1, vector<int>(volume + 1, 0));
// dp[i][j]表示前i件物品体积不超过j的情况下的最大价值
for (int i = 1; i <= n; i++) {
int weight = things[i - 1][0], value = things[i - 1][1];
for (int j = 1; j <= volume; j++) {
// 如果足够放下,就比较放和不放哪个大
// 如果放了,就看当前价值加上剩下容量可以容纳的最大价值
if (j >= weight) dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight] + value);
else dp[i][j] = dp[i - 1][j];
}
}
/*for (vector<int> nums : dp) {
for (int num : nums) cout << num << " ";
cout << endl;
}*/
return dp[n][volume];
}
int main() {
int n, volume;
cin >> n >> volume;
vector<vector<int>> things(n, vector<int>(2));
for (int i = 0; i < n; i++)
cin >> things[i][0] >> things[i][1];
cout<<package01(things, volume, n);
return 0;
}
空间优化为一维数组
int package01(const vector<vector<int>>& things,const int volume,const int n) {
vector<int> dp(volume, 0);
for (int i = 1; i <= n; i++)
for (int j = volume; j >= things[i - 1][0]; j--)
dp[j] = max(dp[j], dp[j - things[i - 1][0]] + things[i - 1][1]);
return dp[volume];
}
虽然还不是很理解,但知道了大概怎么用
完全背包
很神奇的是,就结果而言,完全背包压缩后的代码只需要把01背包压缩后的代码的内层遍历由反向改为正向即可