#include<bits/stdc++.h>
using namespace std;
int w[5000];
int v[5000];
int dp[10000];
int main()
{
int n,m;
cin >> n >> m;
for(int i=1;i<=n;i++) cin >> w[i] >> v[i];
for(int i=1;i<=n;i++)
{
for(int j=m;j>=w[i];j--)
{
dp[j]=max(dp[j],dp[j-w[i]]+v[i]);
}
}
cout << dp[m] << endl;
}
#include<bits/stdc++.h>
using namespace std;
int w[5000];
int v[5000];
int f[12900];
int path[10000][10000];
int main()
{
int n,m;
cin >> n >> m;
for(int i=1;i<=n;i++)
cin >> w[i] >> v[i];
for(int i=1;i<=n;i++)
{
for(int j=m;j>=w[i];j--)
{
if(f[j-w[i]]+v[i]>f[j])
{
f[j]=f[j-w[i]]+v[i];
path[i][j]=1;
}
}
}
int i=n,j=m;
while(i>0&&j>=0)
{
if(path[i][j])
{
cout << i <<" "<< v[i]<< endl;
j-=w[i];
}
i--;
}
cout << f[m] << endl;
return 0;
}
#include<bits/stdc++.h>
using namespace std;
int w[5000];
int v[5000];
int f[12900];
int path[10000][10000];
int main()
{
int n,m;
cin >> n >> m;
for(int i=1;i<=n;i++)
cin >> w[i] >> v[i];
for(int i=1;i<=n;i++)
{
for(int j=m;j>=w[i];j--)
{
if(f[j-w[i]]+v[i]>f[j])
{
f[j]=f[j-w[i]]+v[i];
path[i][j]=1;
}
}
}
int i=n,j=m;
while(i>0&&j>=0)
{
if(path[i][j])
{
cout << i <<" "<< v[i]<< endl;
j-=w[i];
}
i--;
}
cout << f[m] << endl;
return 0;
}