1 条题解

  • 0
    @ 2025-1-23 22:15:51

    一道较为基础的背包dp题

    不会背包dp的人看这里 我们设dp[i]表示重量为i的最大价值,从而可以很轻松的想出:

    这要从目标重量一直到第i个重量进行降序,从而 dp[j] = max(dp[j], dp[j - v] + w);

    v为重量,w为价值

    知道这些后,可以轻松写出AC解:

    #include<bits/stdc++.h>
    using namespace std;
    const int N = 5e5 + 5;
    int T, n, P, Q, dp[N];
    bool flag;
    int main () {
        cin >> T;
        while (T--) {
            flag = false;
            memset(dp, 0, sizeof(dp));
            cin >> n >> P >> Q;
            for (int i = 1, p, c; i <= n; i++) {
                cin >> p >> c;
                for (int j = Q; j >= c; j--) {
                    dp[j] = max(dp[j], dp[j - c] + p);
                }
            }
            for (int i = 0; i < N; i++) {
                if (dp[i] >= P) {
                    cout << i << "\n";
                    flag = true;
                    break;
                }
            }
            if (!flag) cout << "-1\n";
        }
        return 0;
    }
    

    本人若狗一个,不喜勿喷

    • 1

    信息

    ID
    35249
    时间
    1000ms
    内存
    512MiB
    难度
    2
    标签
    递交数
    4
    已通过
    1
    上传者