2017"百度之星"程序设计大赛 - 资格赛 度度熊与邪恶大魔王 背包DP
31 int n, m, a[MAXN * 100], b[MAXN * 100] , k[MAXN], p[MAXN]; 32 int dp[11][MAXN]; 33 34 int main() { 35 ios::sync_with_stdio(false), cin.tie(0); 36 while (cin >> n >> m) { 37 rep(i, 0, n) cin >> a[i] >> b[i]; 38 rep(i, 0, m) cin >> k[i] >> p[i]; 39 memset(dp, 0x3f, sizeof(dp)); 40 rep(i, 0, 11) dp[i][0] = 0; 41 rep(K, 0, 11) { 42 rep(i, 0, m) p[i] -= K; 43 rep(i, 0, 1001) rep(j, 0, m) if (p[j] > 0) { 44 if (p[j] >= i) dp[K][i] = min(dp[K][i], k[j]); 45 else dp[K][i] = min(dp[K][i], dp[K][i - p[j]] + k[j]); 46 } 47 rep(i, 0, m) p[i] += K; 48 } 49 ll ans = 0, fg = 1; 50 rep(i, 0, n) { 51 if (dp[b[i]][a[i]] == INF) { 52 cout << -1 << endl; 53 fg = 0; 54 break; 55 } 56 ans = ans + dp[b[i]][a[i]]; 57 } 58 if (fg) cout << ans << endl; 59 } 60 return 0; 61 }