1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| #include <bits/stdc++.h>
#define rep(i, s, e) for(int i = s; i <= e; ++i) #define _rep(i, s, e) for(int i = s; i >= e; --i)
using namespace std;
int n, m, a[105], mx[105]; pair<int, int> b[105]; long long dp[105][10005], ans;
signed main() { scanf("%d %d", &n, &m); rep(i, 1, n) { scanf("%d", &a[i]); } rep(i, 1, m) { scanf("%d %d", &b[i].first, &b[i].second); } sort(b + 1, b + 1 + m, greater<pair<int, int>>()); rep(i, 1, m) { rep(j, 1, n) { mx[i] += min(a[j], i); } } rep(j, 0, m) { rep(k, 0, n * m) { dp[j][k] = - (1ll << 60); } } dp[0][0] = 0; rep(i, 1, m) { _rep(j, i, 1) { _rep(k, mx[j], b[i].first) { dp[j][k] = max(dp[j][k], dp[j - 1][k - b[i].first] + b[i].second); } } } ans = 0; rep(j, 0, m) { rep(k, 0, n * m) { ans = max(ans, dp[j][k]); } } printf("%lld\n", ans); return 0; }
|