度度熊与邪恶大魔王
Time Limit: 2000/1000 MS (Java/Others)
Memory Limit: 32768/32768 K (Java/Others)
解题思路:对怪兽的防御力进行逐一枚举,然后就是背包了。。。
代码如下:
#include<bits/stdc++.h>
#define LL __int64
using namespace std;
int a[100010],b[100010];
int k[1010],p[1010];
LL dp[15][1010];
int main()
{
int n,m;
while(~scanf("%d %d",&n,&m))
{
for(int i=0;i<n;i++)
scanf("%d%d",&a[i],&b[i]);
for(int i=0;i<m;i++)
scanf("%d%d",&k[i],&p[i]);
for(int i=0;i<=10;i++)///枚举所有情况
{
dp[i][0] = 0;
for(int j=1;j<=1000;j++)
dp[i][j] = 1e18+10;
for(int j=0;j<m;j++)///背包
{
if(p[j]<=i)continue;
for(int g=1;g<=1000;g++)
{
int t = max(g-p[j]+i,0);
dp[i][g] = min(dp[i][g],dp[i][t]+k[j]);
}
}
}
LL ans = 0;
for(int i=0;i<n;i++)
{
if(dp[b[i]][a[i]]==1e18)
{ans = -1; break;}
ans+=dp[b[i]][a[i]];
}
printf("%I64d\n",ans);
}
return 0;
}