#include<stdio.h>
#include<iostream>
#include<cmath>
#include<vector>
#include<algorithm>
using namespace std;
int main(){
int n,w;
cin>>n>>w;
int wei[n+1],val[n+1];
//输入重量、价值
for(int i=1;i<=n;i++){
cin>>wei[i]>>val[i];
}
//初始化背包
int a[n+1][w+1];
for(int i=0;i<=n;i++){
for(int j=0;j<=w;j++){
a[i][j]=0;
}
}
//状态转移,a[i][j]表示从前i个物品里选出总重量不大于j的物品最大价值和
for(int i=1;i<=n;i++){
for(int j=1;j<=w;j++){
if(j>=wei[i]){
a[i][j]=max(a[i-1][j],a[i-1][j-wei[i]]+val[i]);
//分情况讨论,选第i件物品和不选两种情况,另外if保证j-wei[i]非负
}
else{
a[i][j]=a[i-1][j];
}
}
}
cout<<a[n][w]<<endl;
return 0;
}
/*
Points: 01背包
if(j>=wei[i]){
a[i][j]=max(a[i-1][j],a[i-1][j-wei[i]]+val[i]);
}
else{
a[i][j]=a[i-1][j];
}
*/
#include<stdio.h>
#include<iostream>
#include<cmath>
#include<vector>
#include<algorithm>
using namespace std;
int main(){
int n,w;
cin>>n>>w;
int wei[n+1],val[n+1];
//输入重量、价值
for(int i=1;i<=n;i++){
cin>>wei[i]>>val[i];
}
//初始化背包
int a[n+1][w+1];
for(int i=0;i<=n;i++){
for(int j=0;j<=w;j++){
a[i][j]=0;
}
}
//状态转移,a[i][j]表示从前i个物品里选出总重量不大于j的物品最大价值和
for(int i=1;i<=n;i++){
for(int j=1;j<=w;j++){
if(j>=wei[i]){
a[i][j]=max(a[i-1][j],a[i][j-wei[i]]+val[i]);
//不同之处i-1变成i
}
else{
a[i][j]=a[i-1][j];
}
}
}
cout<<a[n][w]<<endl;
return 0;
}
/*
Points:
完全背包
if(j>=wei[i]){
a[i][j]=max(a[i-1][j],a[i-1][j-wei[i]]+val[i]);
}
else{
a[i][j]=a[i-1][j];
}
*/