#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; bool dp[2][20001]; bool cmp(pair a, pair b) { if (a.second == b.second) { return a.first > b.first; } return a.second < b.second; } int main(void) { cin.tie(0); ios::sync_with_stdio(false); vector > v; vector > p; int n, a, b; cin >> n; for (int i = 0; i < n; i++) { cin >> a >> b; v.push_back(make_pair(a, b)); p.push_back(make_pair(a + b, i)); } int res = 0; sort(p.begin(), p.end()); memset(dp, false, sizeof(dp)); dp[1][0] = true; for (int I = 0; I < n; I++) { int i = p[I].second; memcpy(dp[0], dp[1], sizeof(dp[1])); memset(dp[1], false, sizeof(dp[1])); for (int j = 0; j < v[i].second; j++) { if (!dp[0][j]) { continue; } dp[1][j + v[i].first] = true; } for (int j = 0; j <= 20000; j++) { if (dp[0][j]) { dp[1][j] = true; } } } for (int i = 0; i <= 20000; i++) { if (dp[1][i]) { res = max(res, i); } } cout << res << '\n'; return 0; }