#include <stdio.h> #include <limits.h> int n, M; #define MAX 3407 #define MMAX 12880 int w[MAX+1]; int d[MAX+1]; int mem[MAX+1][MMAX+1]; int Max(int a, int b) { return a > b ? a : b; } // 考虑index为n的。 int Value(int *w, int *d, int n, int M) { if (n == 0) { if (M >= w[0]) return d[0]; else return 0; } if (M - w[n] >= 0) { return Max(Value(w, d, n - 1, M), Value(w, d, n - 1, M - w[n-1]) + d[n]); } else { return Value(w, d, n - 1, M); } } // memory void Init() { int i, j; for (i = 0;i < MAX+1; ++i) { for (j = 0; j < MMAX + 1; ++j) { mem[i][j] = INT_MIN; } } } int Value2(int *w, int *d, int n, int M) { if (mem[n][M] != INT_MIN) return mem[n][M]; if (n == 0) { if (w[0] <= M) { mem[n][M] = d[0]; } else { mem[n][M] = 0; } return mem[n][M]; } if (w[n] <= M) { mem[n][M] = Max(Value2(w, d, n - 1, M - w[n]) + d[n], Value2(w, d, n - 1, M)); } else { mem[n][M] = Value2(w, d, n - 1, M); } return mem[n][M]; } int main() { int i; scanf("%d%d", &n, &M); for (i = 0; i < n; ++i) { scanf("%d%d", &w[i], &d[i]); } Init(); printf("%d/n", Value2(w, d, n - 1, M)); return 0; }