1 条题解

  • 0
    @ 2026-3-25 8:47:17

    文字教学

    这是一道经典的01背包问题变种,核心是把“价格×重要度”作为物品的价值,在总钱数限制下最大化总价值。

    1. 状态定义:设 dp[j] 表示花费不超过 j 元时,能获得的最大总价值(即价格×重要度的总和)。
    2. 状态转移:对于每个物品(价格 v,价值 val = v×p),从后往前遍历 j(避免重复选同一个物品):
      • 不买这个物品:dp[j] 保持不变。
      • 买这个物品:如果 j >= v,则 dp[j] = max(dp[j], dp[j - v] + val)
    3. 最终答案dp[n] 就是不超过总钱数的最大总价值。

    代码

    #include <bits/stdc++.h>
    using namespace std;
    
    int dp[30005];
    int v[25], p[25];
    
    int main() {
        int n, m;
        cin >> n >> m;
        for (int i = 1; i <= m; ++i) {
            cin >> v[i] >> p[i];
        }
        memset(dp, 0, sizeof(dp));
        for (int i = 1; i <= m; ++i) {
            int val = v[i] * p[i];
            for (int j = n; j >= v[i]; --j) {
                dp[j] = max(dp[j], dp[j - v[i]] + val);
            }
        }
        cout << dp[n] << endl;
        return 0;
    }
    
    • 1

    信息

    ID
    60
    时间
    1000ms
    内存
    64MiB
    难度
    3
    标签
    递交数
    3
    已通过
    3
    上传者