#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;
}