背包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 
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<

 

你可能感兴趣的:(背包DP)