1 条题解

  • 3
    @ 2023-4-17 16:31:17

    二维费用0101背包模板,显然每个物品有两个属性,一个是它消耗的精灵球数量,一个是它会造成的伤害。所以这是一个二维费用背包了,每个宠物要么收复一次,要么不收复。所以是0101

    按照0101背包的写法写二维就可以了,题目说还要求最大的剩余体力,求最大剩余体力我们枚举一遍所有的状态,当前状态如果和最终答案相等,然后再去求解最大剩余体力即可。

    cin >> n >> m >> c;
    for (int i = 1; i <= c; i++) cin >> a[i].num >> a[i].damage;
    for (int i = 1; i <= c; i++) // 先枚举物品个数
    {
        for (int j = n; j >= a[i].num; j--) // 01 倒序枚举 球的数量
        {
            for (int k = m; k >= a[i].damage; k--) // 倒叙枚举 伤害
            {
                dp[j][k] = max(dp[j][k], dp[j - a[i].num][k - a[i].damage] + 1); // 转移
            }
        }
    }
    cout << dp[n][m] << " ";
    ans = 0;
    for (int i = 0; i <= n; i++)
    {
        for (int j = 0; j <= m; j++)
        {
            if (dp[i][j] == dp[n][m]) // 如果dp[i][j] 和最终答案一样,就保证收集的精灵球个数一样。
            {
                ans = max(ans, m - j); // 求解剩余体力,也就是 m - j
            }
        }
    }
    cout << ans;
    
    • 1

    信息

    ID
    174
    时间
    1000ms
    内存
    256MiB
    难度
    7
    标签
    递交数
    110
    已通过
    22
    上传者