1 条题解

  • 0
    @ 2025-10-10 22:20:16

    方法思路

    1.问题分析​:问题要求从多个副本中选择若干副本,使得总时间不超过H,总精力不超过S,同时金币数最大。每个副本只能选择一次。

    ​2.动态规划设置​:使用一个二维数组dp,其中dp[i][j]表示在时间不超过i和精力不超过j的情况下能获得的最大金币数。

    ​3.初始化​:将dp数组初始化为0,表示初始状态下没有任何副本被选择时的金币数为0。 ​处理每个副本​:对于每个副本,逆序遍历时间和精力维度,更新dp数组。确保在添加当前副本时,时间和精力不超过限制。

    ​4.结果提取​:最终结果存储在dp[H][S]中,表示在时间和精力限制下的最大金币数。

    #include <iostream>
    #include <vector>
    #include <cmath>
    using namespace std;
    
    int main()
    {
        int N, H, S, i, j, k;
        cin >> N >> H >> S;
        vector<vector<int>> dp(H + 1, vector<int>(S + 1, 0));
        for (i = 0; i < N; i++)
        {
            int m, t, p;
            cin >> m >> t >> p;
            for (j = H; j >= t; j--)
            {
                for (k = S; k >= p; k--)
                {
                    dp[j][k] = max(dp[j][k], dp[j - t][k - p] + m);
                }
            }
        }
    
        cout << dp[H][S] << endl;
        return 0;
    }
    
    • 1

    信息

    ID
    142
    时间
    2000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者