背包DP

E - Crested Ibis vs Monster / 


Time Limit: 2 sec / Memory Limit: 1024 MB

Score : 500500 points

Problem Statement

Ibis is fighting with a monster.

The health of the monster is HH.

Ibis can cast NN kinds of spells. Casting the ii-th spell decreases the monster's health by AiAi, at the cost of BiBi Magic Points.

The same spell can be cast multiple times. There is no way other than spells to decrease the monster's health.

Ibis wins when the health of the monster becomes 00 or below.

Find the minimum total Magic Points that have to be consumed before winning.

Constraints

  • 1≤H≤1041≤H≤104
  • 1≤N≤1031≤N≤103
  • 1≤Ai≤1041≤Ai≤104
  • 1≤Bi≤1041≤Bi≤104
  • All values in input are integers.

Input

Input is given from Standard Input in the following format:

HH NN
A1A1 B1B1
::
ANAN BNBN

Output

Print the minimum total Magic Points that have to be consumed before winning.


Sample Input 1 Copy

Copy

9 3
8 3
4 2
2 1

Sample Output 1 Copy

Copy

4

First, let us cast the first spell to decrease the monster's health by 88, at the cost of 33 Magic Points. The monster's health is now 11.

Then, cast the third spell to decrease the monster's health by 22, at the cost of 11 Magic Point. The monster's health is now −1−1.

In this way, we can win at the total cost of 44 Magic Points.


Sample Input 2 Copy

Copy

100 6
1 1
2 3
3 9
4 27
5 81
6 243

Sample Output 2 Copy

Copy

100

It is optimal to cast the first spell 100100 times.


Sample Input 3 Copy

Copy

9999 10
540 7550
691 9680
700 9790
510 7150
415 5818
551 7712
587 8227
619 8671
588 8228
176 2461

Sample Output 3 Copy

Copy

139815

【题意】

就是在完全背包条件下,找大于等于最大容量的最小价值。

总算找了一个比较舒服的写法/

#include <bits/stdc++.h>
using namespace std;
#define ll long long
const ll N=1e5+10;
const ll inf=0x3f3f3f3f;
ll a[N],b[N];
ll dp[N];
int main()
{
   ll h,n;
   while(cin>>h>>n)
   {
   memset(dp,0x3f,sizeof(dp));
   dp[0]=0;
   for(ll i=1;i<=n;++i)
   {
       cin>>a[i]>>b[i];
   }
   for(ll i=1;i<=n;++i)
    {
      for(ll j=a[i];j<=1e5;++j)
      {
         if(dp[j-a[i]]!=inf)
            dp[j]=min(dp[j],dp[j-a[i]]+b[i]);
      }
   }
   ll m=inf;
   for(ll i=h;i<=1e5;++i)
   {
      m=min(m,dp[i]);
   }
   cout<<m<<endl;
   }
   return 0;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值