#include #include #include #include using namespace std; #define INF 1e18 int k[1005],p[1005],a[100010],b[100010]; long long dp[15][1005]; //dp[i][j] 表示一种防御为i 血量为j 的怪物需要使用的最少晶石数 int main() { long long n,m; while(cin>>n>>m) { for(int i=1;i<=n;i++) cin>>a[i]>>b[i]; for(int i=1;i<=m;i++) cin>>k[i]>>p[i]; for(int i=0;i<=10;i++) { for(int j=1;j<=1000;j++) dp[i][j]=INF; //开始的时候赋值为无穷大 dp[i][0]=0; //血量为0的怪物不需要晶石 for(int j=1;j<=m;j++) { if(p[j]<=i) //如果造成的伤害小于防御 那么就无效 continue; for(int q=1;q<=1000;q++) //否则枚举血量 求出需要的最少晶石数 { int kk=q-p[j]+i>0?q-p[j]+i:0; dp[i][q]=min((long long)dp[i][kk]+k[j],dp[i][q]); } } } long long ans=0; for(int i=1;i<=n;i++) ans+=dp[b[i]][a[i]]; if(ans>=INF) cout<<-1<