#include #include #include using namespace std; typedef long long ll; // 生命值为i , 防御值为j 所需要的最少晶石 ll dp[1005][15]; // 记录每个怪兽的生命值和防御力 ll a[100005]; ll b[100005]; // 消耗的晶石数 和 技能的伤害值 struct Skill { ll k; ll p; }; Skill skill[1005]; bool cmp(Skill skill_1,Skill skill_2) { return skill_1.p < skill_2.p; } int main() { int n , m ; // n 怪兽个数 m 技能个数 // freopen("a.in","r",stdin); while(~scanf("%d %d",&n,&m)) { for(int i = 0 ; i < n ; i++) { scanf("%I64d %I64d",&a[i],&b[i]); } for(int i = 0 ; i < m ; i++) { scanf("%I64d %I64d",&skill[i].k,&skill[i].p); } sort(skill,skill+m,cmp); // dp[i][j] = min(dp[i][j],dp[i-(skill.p-j)][j]+skill.k) // memset(dp,0x3f,sizeof(dp)); for(int i = 0 ; i <= 1000 ; i ++) { for(int j = 0 ; j <= 10 ; j ++) { if(i == 0) { dp[0][j] = 0; } else { dp[i][j] = 1e18; } } } // for(int i = 1 ; i <= 1000 ; i ++) { for(int j = 0 ; j <= 10 ; j++) { for(int k = 0 ; k < m ; k ++) { for(int i = 1 ; i <= 1000 ; i++) { int cut = skill[k].p - j; // cut 是伤害值 if(cut < 0) { continue; } if(cut > i) { dp[i][j] = min(dp[i][j],skill[k].k); } else { dp[i][j] = min(dp[i][j],dp[i-cut][j]+skill[k].k); } } } } // } long long ret = 0; for(int i = 0 ; i < n ; i ++) { ret += dp[a[i]][b[i]]; } if(ret > 1e18) { puts("-1"); } else { printf("%I64d\n",ret); } } return 0; }