Atcoder E - Crested Ibis vs Monster(背包dp)

题意
朱鹭正在和一只怪兽搏斗,朱鹭能施N种魔法。释放第i个法术降低怪物的生命值 A i A_i ;,以 B i B_i 为代价;神奇的点。同一个法术可以施放多次。没有其他方法可以降低怪物的生命值。当怪物的生命值变为0或以下时,Ibis获胜。找出获胜前必须消耗的最小魔法点数。
思路
背包dp。
d p [ i ] dp[i] 为生命值为 i i 时的消耗的最小魔法点数。
初始化 d p dp 数值为无穷。
类似于完全背包状态转移方程
d p [ j ] = m i n { d p [ j w [ i ] ] + v [ i ] } dp[j]=min\left \{dp[j-w[i]]+v[i] \right \} \

#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
#define ll long long
const ll N = 1e5+10 ;
int w[N],v[N];
int dp[N];
int main(){
   int n,k;
   cin >> n >> k;
   int m = -1;
   memset(dp,0x3f,sizeof dp);
   dp[0] = 0;
   for(int i = 1;i <= k;++i) {cin>>w[i]>>v[i];}
   for(int i = 1;i <= k;++i){
      for(int j = w[i];j <= 1e4;++j){
         if(dp[j-w[i]] != 0x3f3f3f3f) dp[j] = min(dp[j],dp[j-w[i]] + v[i]);
      }
   }
   m = 0x3f3f3f3f;
   for(int i = n;i <= 1e4;++ i){
      m = min(m,dp[i]);
   }
   cout<<m<<endl;
}
发布了632 篇原创文章 · 获赞 27 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/qq_43408238/article/details/104090983
今日推荐