// O(n^(3/2)*x) time #include using namespace std; int SubsetSum(vector &X) { int n = X.size(); random_shuffle(X.begin(), X.end()); int window = int((sqrt(n)/2 + 1) * *max_element(X.begin(), X.end())); vector> Poss(2, vector(2*window+1, -1)); Poss[0][window] = 0; int tot = 0; for (int i = 0; i < n; tot += X[i], ++i) { for (int v = 0; v <= 2*window; ++v) if (Poss[i%2][v] == i) { if (v-X[i] >= 0) Poss[(i+1)%2][v-X[i]] = i+1; if (v+X[i] <= 2*window) Poss[(i+1)%2][v+X[i]] = i+1; } } for (int v = window; v <= 2*window; ++v) if (Poss[n%2][v] == n) { return (tot+v-window)/2; } } int main(void) { int n, x; scanf("%d%d", &n, &x); vector T(n); for (int &t: T) scanf("%d", &t); sort(T.begin(), T.end()); int max_T = T.back(); while (!T.empty() && T.back() > x) T.pop_back(); int ans; if (T.size() > 4) { vector Jobs; for (int i = 4; i < T.size(); ++i) Jobs.push_back(x+1-T[i]); ans = x+1 + SubsetSum(Jobs); } else if (T.size() > 2) { ans = x+1; } else ans = max_T; printf("%d\n", max(max_T, ans)); }