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