abc153E 杀死怪兽所需的最少魔法

75 阅读1分钟

题面:stk正在打体力为H的怪兽,stk有n种咒语,第i种咒语可以造成A[i]点伤害,但需要花费B[i]点魔法,咒语使用次数不限,当怪兽体力小于等于0时死亡。求杀死怪兽需要的最少魔法。

范围:1 <= H <= 1E4; 1 <= n <= 1E3; 1 <= A[i],B[i] <= 1E4

思路:完全背包的变形,记dp[i][j]表示仅使用前i种咒语、造成j点伤害所需要的最少魔法,按选与不选转移。

#include <bits/stdc++.h>
using i64 = long long;
const int N = 1005;
const int M = 10005;
const i64 inf = 1E16;
int A[N], B[N];
i64 dp[M];
void solve() {
    int H, n;
    std::cin >> H >> n;
    for (int i = 1; i <= n; i++) {
        std::cin >> A[i] >> B[i];
    }
    for (int i = 1; i <= H; i++) {
        dp[i] = inf;
    }
    dp[0] = 0;
    for (int i = 1; i <= n; i++) {
        for (int j = 0; j <= H; j++) {
            if (j < A[i])
                dp[j] = min(dp[j], B[i]);
            else
                dp[j] = min(dp[j], B[i] + dp[j-A[i]]);
        }
    }
    std::cout << dp[H] << "\n";
}
int main() {
    std::cin.tie(0)->sync_with_stdio(0);
    int t = 1;
    while (t--) solve();
    return 0;
}

标签:背包dp