import java.util.*; public class Main{ public static void main(String[] args){ Scanner in = new Scanner(System.in); int n = in.nextInt(); int V = in.nextInt();
int[] v = new int[n+1];
int[] w = new int[n+1];
int[][] dp = new int[n+1][V+1];
for(int i = 0;i< n;i++){
v[i+1] = in.nextInt();
w[i+1] = in.nextInt();
}
for(int i = 1;i<= n;i++){
for(int j = 1;j <= V;j++){
if(v[i] > j)dp[i][j] = dp[i-1][j];
else{
dp[i][j] = Math.max(dp[i-1][j],dp[i-1][j-v[i]]+w[i]);
}
}
}
System.out.println(dp[n][V]);
int[] dp2=new int[V+1];
Arrays.fill(dp2,Integer.MIN_VALUE);
//没有物品时,价值为0
dp2[0]=0;
for(int i=1;i<=n;i++){
//由于每个物品只能用一次,为了防止重复计算,需要倒序遍历
for(int j=V;j>=v[i];j--){
//状态转移,要么选择第i件物品,要么不选,取价值最大的
dp2[j]=Math.max(dp2[j-v[i]]+w[i],dp2[j]);
}
}
//如果小于0,说明不能从初始状态转移过来,无解
if(dp2[V]<0){
dp2[V]=0;
}
System.out.println(dp2[V]);
}
}