E - Crested Ibis vs Monster /
Time Limit: 2 sec / Memory Limit: 1024 MB
Score : 500500 points
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.
Input is given from Standard Input in the following format:
HH NN A1A1 B1B1 :: ANAN BNBN
Print the minimum total Magic Points that have to be consumed before winning.
Copy
9 3 8 3 4 2 2 1
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.
Copy
100 6 1 1 2 3 3 9 4 27 5 81 6 243
Copy
100
It is optimal to cast the first spell 100100 times.
Copy
9999 10 540 7550 691 9680 700 9790 510 7150 415 5818 551 7712 587 8227 619 8671 588 8228 176 2461
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<