返回
11083 旅游背包(优先做)
闲谈
2023-11-08 16:56:22
背景介绍
问题
若给你一个背包,让你放置n个物品,每个物品有自己的体积和价值,当你的背包装满了,就会获得一个总价值。如果要获得最大的总价值,需要慎重选择放入背包中的物品。
输入格式
输入共包括3行:
- 第一行,两个整数n和c。n表示物品的数量,c表示背包的容量。
- 第二行,n个整数vi,表示每个物品的体积。
- 第三行,n个整数wi,表示每个物品的价值。
输出格式
输出仅一行,一个整数,表示能获得的最大总价值。
样例输入
5 10
2 3 5 7 1
3 5 7 10 2
样例输出
21
数据范围
- 1 ≤ n ≤ 1000,1 ≤ c ≤ 1000
- 0 ≤ vi ≤ 1000,0 ≤ wi ≤ 1000
解决思路
- 使用动态规划进行求解,设dp[i][j]表示在考虑前i个物品,背包容量为j时,可以获得的最大价值。
- dp[i][j]的递推公式为:
dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - vi] + wi)
- 初始化:dp[0][j] = 0
- 边界情况:如果j < vi,则dp[i][j] = dp[i - 1][j]
- 由于要考虑物品的体积,所以遍历物品时需要按体积从小到大进行。
代码实现
#include <iostream>
#include <vector>
using namespace std;
int main() {
int n, c;
cin >> n >> c;
vector<int> v(n), w(n);
for (int i = 0; i < n; i++) {
cin >> v[i];
}
for (int i = 0; i < n; i++) {
cin >> w[i];
}
vector<vector<int>> dp(n + 1, vector<int>(c + 1, 0));
for (int i = 1; i <= n; i++) {
for (int j = 0; j <= c; j++) {
if (j < v[i - 1]) {
dp[i][j] = dp[i - 1][j];
} else {
dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - v[i - 1]] + w[i - 1]);
}
}
}
cout << dp[n][c] << endl;
return 0;
}