当前位置 : 主页 > 编程语言 > 其它开发 >

AcWing-1022

来源:互联网 收集:自由互联 发布时间:2022-05-30
题解借鉴两位大佬的解析 墨染空 野生铅笔 本题是一道 01背包 的扩展题 —— 二维费用01背包问题 把 野生宝可梦 看做物品,则捕捉他需要的 精灵球 个数就是 第一费用 ,战斗 皮神要掉

题解借鉴两位大佬的解析 墨染空 && 野生铅笔

本题是一道 01背包 的扩展题 —— 二维费用01背包问题

野生宝可梦 看做物品,则捕捉他需要的 精灵球 个数就是第一费用,战斗皮神要掉的血就是第二费用

在背包问题中,体积w与价值v是可以互逆的!
可以将f[i]表示为体积为i能装的最大价值,
也可以将f[i]表示为价值为i所需的最小体积。

以上就是本题的 阅读理解分析部分 ,接下来直接上闫氏DP分析法

IMG_C0D309FBA487-1.jpeg


#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 110, M = 1010, K = 510;
int n, m, t;
int v1[N], v2[N];
int f[M][K];
int main()
{

    cin >> m >> t >> n;
    for (int i = 1; i <= n; ++ i) cin >> v1[i] >> v2[i];
    // 相当于优化;
    for (int i = 1; i <= n; ++ i)
    {
        for (int j = m; j >= v1[i]; -- j) //倒序输出
        {
            for (int k = t - 1; k >= v2[i]; -- k)
            {
                f[j][k] = max(f[j][k], f[j - v1[i]][k - v2[i]] + 1);
            }
        }
    }
    cout << f[m][t - 1] << " "; // 之所以是 t-1 是因为最坏的情况下皮卡丘也要剩余一滴血
    int k = t - 1; // 倒退 剩余的最大血量
    while (k > 0 && f[m][k - 1] == f[m][t - 1]) k -- ;
    cout << t - k << endl;
    return 0;
}

初始状态 : f[0][0][0]

目标状态: f[n][m][t-1]

【文章出处:香港多ip站群服务器 http://www.558idc.com/hkzq.html提供,感恩】
上一篇:Python_Pandas入门
下一篇:没有了
网友评论