/*
TASK:lift
LANG:C++
*/
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <vector>

using namespace std;

typedef struct man {
    int h, w;
    
    man() {}
    man(int _h, int _w) {
        h = _h;
        w = _w;
    }
    bool operator < (const man &m) const {
        if (h == m.h) {
            return w > m.w;
        }
        return h < m.h;
    }
}man;

int used[16];
man m[16];
int ans = 0;
int N, T;

void capacate(int w) {
    int cur = 0;
    for (int i = N-1; i >= 0; i--) {
        if (!used[i] && w + m[i].w <= T) {
            if (m[i].h > cur) {
                cur = m[i].h;
            }
            w += m[i].w;
            used[i] = 1;
        }
    }
    ans += cur;
}
int turn(void) {
    for (int i = 0; i < N; i++) {
        if (used[i]) {
            for (int j = 0; j < N; j++) {
                if (!used[j] && m[i].w + m[j].w <= T) {
                    used[i] = 0;
                    ans += m[i].h;
                    return m[i].w;
                }
            }
        }
    }
    return 0;
}
                                

int main() {
    scanf("%d%d", &N, &T);
    
    for (int i = 0; i < N; i++) {
        scanf("%d%d", &m[i].h, &m[i].w);
    }
    
    sort(m, m+N);
    
    int count = N;
    int t = 0;
        
    capacate(0);
    
    while (turn()) {
        capacate(0);
    }
    
    printf("%d\n", ans);
    
    return 0;
}
    
