#include <stdarg.h>
#include <stdio.h>
#include<malloc.h>
//完全背包和01背包的唯一区别就是两层循环中再添加一层,
/*
2 6
5 10
3 1
理解成:
2 6
5 10
5 10
3 1
3 1
即可
*/
int main() {
int volume;
int quantity;
scanf("%d %d", &quantity, &volume);
// 01背包
int* a = (int*)malloc(sizeof(int) * (quantity + 1));
int* b = (int*)malloc(sizeof(int) * (quantity + 1));
a[0] = 0;
b[0] = 0;
for (int i = 1; i <= quantity; i++) {
scanf("\n%d", &a[i]);
scanf("\n%d", &b[i]);
}
int** dp = (int**)malloc(sizeof(int*) * (quantity + 1));
for (int i = 0; i < quantity + 1; i++) {
dp[i] = (int*)malloc(sizeof(int) * (volume + 1));
}
for (int i = 0; i < quantity + 1; i++) {
for (int j = 0; j < volume + 1; j++) {
dp[i][j] = 0;
}
}
int** dp1 = (int**)malloc(sizeof(int*) * (quantity + 1));
for (int i = 0; i < quantity + 1; i++) {
dp1[i] = (int*)malloc(sizeof(int) * (volume + 1));
}
for (int i = 0; i < quantity + 1; i++) {
for (int j = 0; j < volume + 1; j++) {
dp1[i][j] = -100900;
if (j == 0) {
dp1[i][j] = 0;
}
}
}
for (int i = 1; i < quantity + 1; i++) {
for (int j = 1; j <= volume; j++) {
int max = dp[i - 1][j];
int max1 = dp1[i - 1][j];
for (int k = 1; k * a[i] <= j; k++) {
max = max > dp[i - 1][j - k * a[i]] + k * b[i] ? max : dp[i -
1][j - k * a[i]] + k * b[i];
max1 = max1 > dp1[i - 1][j - k * a[i]] + k * b[i] ? max1 : dp1[i -
1][j - k * a[i]] + k * b[i];
}
dp[i][j] = max;
dp1[i][j] = max1;
}
// printf("\n");
}
// for (int i = 1; i < quantity + 1; i++) {
// for (int j = 1; j <= volume; j++) {
// int max = dp1[i - 1][j];
// for(int k = 1;k*a[i]<=j;k++){
// max =max > dp1[i - 1][j - k*a[i]] + k*b[i] ? max: dp1[i -
// 1][j -k*a[i]] + k*b[i];
// }
// dp1[i][j] = max;
// }
// // printf("\n");
// }
printf("%d \n", dp[quantity][volume]);
if (dp1[quantity][volume] > 0) {
printf("%d", dp1[quantity][volume]);
} else {
printf("0");
}
// for(int i =quantity;i>=quantity;i--){
// if(dp1[i][volume]==volume){
// printf("%d",dp2[i][volume]);
// return 0;
// }
// }
// for(int i = 1;i<quantity+1;i++){
// for(int j = 1;j<=volume;j++){
// printf("%d ",dp[i][j]);
// }
// printf("\n");
// // printf("\n");
// }
return 0;
}