import java.util.*;
public class Main{
public static void main(String[] args){
Scanner input = new Scanner(System.in);
int n = input.nextInt();//物品数量
int v = input.nextInt();//背包容量
int[] vol = new int[n + 1]; //体积
int[] val = new int[n + 1]; //价值
for (int i = 0; i < n; i++) {
vol[i + 1] = input.nextInt();
val[i + 1] = input.nextInt();
}
int[] dp = new int[v+1];
for(int i = 1; i <= n; i++){
for(int j = 1; j <= v; j++){
if(j >= vol[i]){
//无限背包和01背包基本类似,区别就在于物品是否唯一,
//如果物品唯一,就从后向前填,这样每次值的更新都是基于没放该物品的情况,相当于只放了一件
//如果物品不唯一,就从前向后填,这样如果容量足以放重复的物品时,会基于前面放过的情况累加,相当于放了多件
dp[j] = Math.max(dp[j], dp[j - vol[i]] + val[i]);
}
}
}
System.out.println(dp[v]);
Arrays.fill(dp,Integer.MIN_VALUE);
dp[0] = 0;
for(int i = 1; i <= n; i++){
for(int j = 1; j <= v; j++){
if(j >= vol[i]){
dp[j] = Math.max(dp[j], dp[j - vol[i]] + val[i]);
}
}
}
if(dp[v]<0){
dp[v] = 0;
}
System.out.println(dp[v]);
}
}