#include #include #include #include #include #include #include #include #include #include #include using namespace std; typedef long long ll; int main() { int N; cin >> N; vector A(N); vector B(N); for (int i = 0; i < N; ++i) { cin >> A[i] >> B[i]; } vector>> dp(N + 1, vector>(2, vector(N * 1001, INT_MAX))); dp[0][0][0] = 0; dp[0][1][0] = 0; for (int i = 0; i < N; ++i) { int a = A[i]; int b = B[i]; for (int j = 0; j < 2; ++j) { for (int k = 1000 * (i + 1); k >= 0; --k) { if (dp[i][j][k] == INT_MAX) continue; int a_time, b_time, n_a_time, n_b_time; if (j == 0) { a_time = k; b_time = dp[i][j][k]; } else { a_time = dp[i][j][k]; b_time = k; } n_a_time = a_time + a; n_b_time = b_time + b; dp[i + 1][0][n_a_time] = min(dp[i + 1][0][n_a_time], b_time); dp[i + 1][0][a_time] = min(dp[i + 1][0][a_time], n_b_time); dp[i + 1][1][n_b_time] = min(dp[i + 1][1][n_b_time], a_time); dp[i + 1][1][b_time] = min(dp[i + 1][1][b_time], n_a_time); } } } int ans = INT_MAX; for (int t = 0; t < N * 1001; ++t) { if (dp[N][0][t] != INT_MAX) ans = min(ans, max(t, dp[N][0][t])); if (dp[N][1][t] != INT_MAX) ans = min(ans, max(t, dp[N][1][t])); } cout << ans << endl; return 0; }