1 #include<iostream>
2 #include<algorithm>
3 #include<cstring>
4 using namespace std;
5
6 pair<int, int> p[210];
7 int f[210][40010];
8 int sum[210];
9
10 bool cmp(pair<int, int>a, pair<int, int>b)
11 {
12 return a.second > b.second;
13 }
14
15 int main()
16 {
17 int n;
18 cin >> n;
19 for (int i = 1; i <= n; i++)
20 {
21 cin >> p[i].first >> p[i].second;
22 }
23 sort(p + 1, p + n + 1, cmp);
24 for (int i = 1; i <= n; i++)
25 sum[i] = sum[i - 1] + p[i].first;
26 memset(f, 0x3f, sizeof(f));
27 f[0][0] = 0;
28 for (int i = 1; i <= n; i++)
29 {
30 //从一个人递推到n个人
31 for (int j = 0; j <= sum[i]; j++)
32 {
33 if (j >= p[i].first) f[i][j] = min(f[i][j], max(f[i - 1][j - p[i].first], j + p[i].second));
34 f[i][j] = min(f[i][j], max(f[i - 1][j], sum[i] - j + p[i].second));
35 //sum[i]表示前i个人打饭的时间和
36 //sum[i]-j=k,k为在2号窗口打饭的时间
37 //f[i][j]表示前i个人在一号窗口打饭的总时间为j时最早吃完的时间
38 }
39 }
40 int mint = 0x3f3f3f3f;
41 for (int i = 0; i <= sum[n]; i++)
42 {
43 mint = min(mint, f[n][i]);
44 }
45 cout << mint;
46 }