#include #include using namespace std; using ll = long long; vector fzt(vector &vec, ll N){ vector ret(1 << N); for (ll i = 0; i < (1 << N); i++){ ret[i] = vec[i]; } for (ll i = 0; i < N; i++){ for (ll j = 0; j < (1 << N); j++){ if (!((j >> i) & 1)){ ret[j + (1 << i)] = max(ret[j + (1 << i)], ret[j]); } } } return ret; } int main(){ ll N, M, Q; cin >> N >> M >> Q; vector A(N); vector B(N); for (ll i = 0; i < N; i++){ cin >> A[i] >> B[i]; } vector sprice(1 << N, 0); vector sval(1 << N, 0); for (ll i = 0; i < (1 << N); i++){ for (ll j = 0; j < N; j++){ if ((i >> j) & 1){ sprice[i] += A[j]; sval[i] += B[j]; } } } vector vec(1 << N, 0); for (ll i = 0; i < (1 << N); i++){ if (sprice[i] <= Q){ vec[i] = sval[i]; } } vector vecmax = fzt(vec, N); ll ans = 0; for (ll i = 0; i < (1 << N); i++){ if (sprice[i] <= M){ ans = max(ans, sval[i] + vecmax[(1 << N) - 1 - i]); } } cout << ans << endl; }