返回

11083 旅游背包(优先做)

闲谈

背景介绍

问题

若给你一个背包,让你放置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;
}