#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n,v;
    cin >> n >>v;
    vector<int>weight(n),value(n);
    for(int i = 0;i <= n;i++)
        cin >> weight[i] >> value[i];
    vector<int>dp(v+1,0),dp2(v+1,INT_MIN);//dp2[v]指能否装满,如果装满则它的结果发生变化,否则装不满。
    dp2[0] = 0;//初始化是刚好装满的关键,因为 dp2[j] = max(dp2[j],dp2[j-weight[i]] + value[i]);
    for(int i = 0;i< n;i++)//如果j-weight[i]减到刚好得0,那么说明刚好可以装满,否则,不可以装满。
    {
        for(int j = v;j >= weight[i];j--)
        {
            dp[j] = max(dp[j],dp[j-weight[i]] + value[i]);
            dp2[j] = max(dp2[j],dp2[j-weight[i]] + value[i]);
        }
    }
    int res = dp2[v]>0?dp2[v]:0;
    cout << dp[v] <<endl;
    cout << res <<endl;
    return 0;
}