#include <iostream>
#include <vector>
using namespace std;
struct point {
int weight;
int value;
};
int main() {
int n, maxweight;
cin >> n >> maxweight;
vector<point> points(n);
for (int i = 0; i < n; i++) {
cin >> points[i].weight >> points[i].value;
}
vector<int> dp(maxweight + 1, 0);
// 动态规划填表
for (int i = 1; i <= n; i++) {
for (int j = maxweight; j >= points[i - 1].weight; j--) {
if (j >= points[i - 1].weight) { // 检查当前重量是否能放下第 i 个物品
dp[j] = max(dp[j], dp[j - points[i - 1].weight] + points[i - 1].value);
}
}
}
// 输出结果
cout << "最大价值: " << dp[maxweight] << endl;
return 0;
}