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

题面:cfy正在打体力为H的怪兽,cfy有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 namespace std;
#define int long long
#define rep(i,a,b) for(int i=a; i<=b; i++)
#define per(i,a,b) for(int i=b; i>=a; i--)

const int N = 1005;
const int M = 10005;
const int inf = 1E16;
int H, n, A[N], B[N], dp[M];
void solve() {
    cin >> H >> n;
    rep(i,1,n) cin >> A[i] >> B[i];
    rep(i,1,H) dp[i] = inf;
    dp[0] = 0;
    rep(i,1,n) rep(j,0,H) {
        if (j < A[i])
            dp[j] = min(dp[j], B[i]);
        else
            dp[j] = min(dp[j], dp[j-A[i]]+B[i]);
    }
    cout << dp[H] << "\n";
}

signed main() {
    cin.tie(0)->sync_with_stdio(0);
    int t = 1;
    while (t--) solve();
    return 0;
}
posted @ 2024-03-10 01:21  chenfy27  阅读(2)  评论(0编辑  收藏  举报