#include <iostream>
#include <vector>
using namespace std;

int main() {
    int n, V;
    cin >> n >> V;

    vector<int> w(n), v(n);
    for (int i = 0; i < n; ++i) {
        cin >> w[i] >> v[i];
    }

    // 方案1:不要求刚好装满
    vector<int> dp1(V + 1, 0);
    // 方案2:要求刚好装满
    vector<int> dp2(V + 1, -1); // -1 表示无法达到该体积
    dp2[0] = 0;

    for (int i = 0; i < n; ++i) {
        for (int j = V; j >= w[i]; --j) {
            // 方案1:不要求刚好装满
            dp1[j] = max(dp1[j], dp1[j - w[i]] + v[i]);

            // 方案2:要求刚好装满
            if (dp2[j - w[i]] != -1) {
                dp2[j] = max(dp2[j], dp2[j - w[i]] + v[i]);
            }
        }
    }

    cout << dp1[V] << endl;
    cout << (dp2[V] == -1 ? 0 : dp2[V]) << endl;
    return 0;
}