stablegradients/pie-gem5-pairs huggingface dataset:
// Slower C++ solution:
#include <bits/stdc++.h>

using namespace std;

#define ll          long long int

#define pb          push_back

#define pll         pair<ll,ll>

#define speed_up    ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);

#define mode        998244353

#define mod         1000000007

#define inf         1000000000000000000LL

#define vl          vector<ll>

#define F           first

#define S           second

#define db          long double

#define sz(x)       (ll)x.size()

#define fix(n)      cout<<fixed<<setprecision(n)

#define rep(i,a,b)  for(ll i=a;i<b;i++)

#define all(x)      x.begin(),x.end()

#define mset(x)     memset(x,0,sizeof x)

#define pi          3.14159265358979323



const int N = 1e5+5;



ll n, v[101], w[101], wt, dp[101][N];



void solve()

{

       cin>>n>>wt;

       rep(i,1,n+1) cin>>w[i]>>v[i];

       rep(i,1,N) dp[0][i]=inf;

       // imp: dp[0][0] = 0

       rep(i,1,n+1)

       {

              rep(j,0,N)

              {

                     dp[i][j]=dp[i-1][j];

                     if(j>=v[i]) dp[i][j]=min(dp[i][j], dp[i-1][j-v[i]]+w[i]);

              }

       }

       ll ans=0;

       rep(j,0,N) if(dp[n][j]<=wt) ans=j;

       cout<<ans;

}





int main() {

	ll T = 1;

	speed_up

	//cin>>T;

	while(T--)

	    solve();

	return 0;

}


// Faster C++ solution for the same problem (measured speedup: 5.096732639864622x):
#include <bits/stdc++.h>

using namespace std;

#define ll          long long int

#define pb          push_back

#define pll         pair<ll,ll>

#define speed_up    ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);

#define mode        998244353

#define mod         1000000007

#define inf         1000000000000000000LL

#define vl          vector<ll>

#define F           first

#define S           second

#define db          long double

#define sz(x)       (ll)x.size()

#define fix(n)      cout<<fixed<<setprecision(n)

#define rep(i,a,b)  for(ll i=a;i<b;i++)

#define all(x)      x.begin(),x.end()

#define mset(x)     memset(x,0,sizeof x)

#define pi          3.14159265358979323



const int N = 1e5+5;

ll n, wt, v[101], w[101];



void solve()

{

       cin>>n>>wt;

       rep(i,0,n) cin>>w[i]>>v[i];

       ll valsum=0;

       rep(i,0,n) valsum += v[i];

       vl dp(valsum+1, INT_MAX);

       dp[0]=0;

       for(ll item=0; item<n; item++)

       {

              ll value = v[item];

              ll weight = w[item];

              for(ll value_already = valsum - value; value_already>=0; value_already--)

              {

                     dp[value_already + value] = min(dp[value_already + value], dp[value_already] + weight);

              }

       }

       ll ans=0;

       rep(i, 0, valsum+1) if(dp[i] <= wt) ans = i;

       cout<<ans;

}







int main() {

	ll T = 1;

	speed_up

	//cin>>T;

	while(T--)

	    solve();

	return 0;

}
// Slower C++ solution:
#include<bits/stdc++.h>

using namespace std;

typedef long long int ll;

const int MAX=1e5+10;

ll dp[MAX];

int main (){

    int N,W;cin >> N >> W;

    memset(dp,63,sizeof dp);

    dp[0]=0;

    for(int i=0;i<N;i++){

        int w,val;

        cin >> w >> val;

        for(int j=MAX;j>=0;j--){

            if(j-val>=0)

                dp[j]=min(dp[j],dp[j-val]+w);

        }



    }

    int res=0;

    for(int i=0;i<MAX;i++){

        if(dp[i]<=W) res = max(res,i);

    }

    cout<<res<<endl;

    return 0;

}


// Faster C++ solution for the same problem (measured speedup: 2.4600344795456563x):
#include <cstring>

#include <iostream>

#include <string>

#include <vector>

#include <algorithm>

#include <sstream>

#include <queue>

#include <deque>

#include <bitset>

#include <iterator>

#include <list>

#include <stack>

#include <map>

#include <set>

#include <functional>

#include <numeric>

#include <utility>



#include <cmath>

#include <iomanip>



using namespace std;



int main()

{

  ios::sync_with_stdio(false);

  cin.tie(0);

  int n;

  cin >> n;

  int w;

  cin >> w;

  int weights[n];

  long long int values[n];

  long long int cur;

  for (int i = 0; i < n; i++) {

    cin >> cur;

    weights[i] = cur;

    cin >> cur;

    values[i] = cur;

  }

  long long int dp[n+1][(1000*n)+1];

  //dp[n][v] represents the minimum weight needed to get value v and only using items with number up to n.

  for (int i = 0; i < n+1; i++) {

    dp[i][0] = 0;

    for (int j = 1; j < (1000*n)+1; j++) {

      dp[i][j] = w+1;

    }

  }

  for (int minInd = 0; minInd < n; minInd++) {

    for (int wanted = 0; wanted < (1000*n); wanted++) {

      dp[minInd+1][wanted] = min(dp[minInd+1][wanted], dp[minInd][wanted]);

      if (dp[minInd][wanted]+weights[minInd] <= w) {

	dp[minInd+1][wanted+values[minInd]] = min(dp[minInd+1][wanted+values[minInd]], dp[minInd][wanted]+weights[minInd]);

      }

    }

  }

  for (int i = (1000*n); i > 0; i--) {

    if (dp[n][i] <= w) {

      cout << i << "\n";

      break;

    }

  }

  return 0;

}
// Slower C++ solution:
#include<bits/stdc++.h>

using namespace std;

typedef long long int ll;

const int MAX=1e5+10;

ll dp[MAX];

int main (){

    int N,W;cin >> N >> W;

    memset(dp,63,sizeof dp);

    dp[0]=0;

    for(int i=0;i<N;i++){

        int w,val;

        cin >> w >> val;

        for(int j=MAX;j>=0;j--){

            if(j-val>=0)

                dp[j]=min(dp[j],dp[j-val]+w);

        }



    }

    int res=0;

    for(int i=0;i<MAX;i++){

        if(dp[i]<=W) res = max(res,i);

    }

    cout<<res<<endl;

    return 0;

}


// Faster C++ solution for the same problem (measured speedup: 1.1794729014329517x):
#include <bits/stdc++.h>

using namespace std;



#define pb push_back

#define mk make_pair

#define fi first

#define se second

#define eb emplace_back



typedef long long ll;

typedef pair<int,int> ii;

typedef vector< pair<int,int> > vii;

const ll INF = 0x3f3f3f3f3f3fef;



const int V = 1e5+2;

const int N = 102;



ll dp[V];

ll p[N];

ll v[N];

ll n,w;

 

int main() {

    ios_base::sync_with_stdio(false);

    for(int i = 0; i < V; i++) dp[i] = INF;



    cin >> n >> w;

    for(int i = 0; i < n; i++) cin >> p[i] >> v[i];

    

    dp[0] = 0;



    for(int i = 0; i < n; i++) 

        for(ll j = V-1; j-v[i] >= 0; j--)

            dp[j] = min(dp[j], dp[j-v[i]]+p[i]);



    for(int i = V-1; i >= 0; i--)

        if(dp[i] <= w) { cout << i << endl; return 0; }





    return 0;

}
// Slower C++ solution:
#include<bits/stdc++.h>

using namespace std;

typedef long long int ll;

const int MAX=1e5+10;

ll dp[MAX];

int main (){

    int N,W;cin >> N >> W;

    memset(dp,63,sizeof dp);

    dp[0]=0;

    for(int i=0;i<N;i++){

        int w,val;

        cin >> w >> val;

        for(int j=MAX;j>=0;j--){

            if(j-val>=0)

                dp[j]=min(dp[j],dp[j-val]+w);

        }



    }

    int res=0;

    for(int i=0;i<MAX;i++){

        if(dp[i]<=W) res = max(res,i);

    }

    cout<<res<<endl;

    return 0;

}


// Faster C++ solution for the same problem (measured speedup: 3.0096334498017385x):
#include<iostream>

#define ll long long int

using namespace std;

ll n, mCap;

ll b[110], v[110];

ll memo[110][110000];

ll totposs = 0;

ll dp(){

	for(ll i = 0;i<=n;i++){

		for(ll j = 1;j<=totposs;j++){

			memo[i][j] = 1e15;

		}

	}

	

	for(ll i = 1;i<=n;i++){

		for(ll j = 1;j<=totposs;j++){

			if(j - v[i-1] >= 0){

//				cout<<"in\n";

				memo[i][j] = 

					min(memo[i-1][j],

						memo[i-1][j-v[i-1]] + b[i-1]

					);

			}else{

				memo[i][j] = memo[i-1][j];

			}

		}

	}

	ll ans = 0;

	for(ll i = 1;i<=n;i++){

		for(ll j = 1;j<=totposs;j++){

			if(memo[i][j]<=mCap){

				ans = max(ans, j);

			}

//			cout<<memo[i][j]<<" ";

		}//cout<<"\n";

	}

	

	return ans;

}



int main(){

	cin>>n>>mCap;

	

	for(ll i = 0;i<n;i++){

		cin>>b[i]>>v[i];

		totposs+=v[i];

	}

	cout<<dp()<<"\n";

	return 0;

}
// Slower C++ solution:
#include <cstring>

#include <iostream>

#include <string>

#include <vector>

#include <algorithm>

#include <sstream>

#include <queue>

#include <deque>

#include <bitset>

#include <iterator>

#include <list>

#include <stack>

#include <map>

#include <set>

#include <functional>

#include <numeric>

#include <utility>



#include <cmath>

#include <iomanip>



using namespace std;



int main()

{

  ios::sync_with_stdio(false);

  cin.tie(0);

  int n;

  cin >> n;

  int w;

  cin >> w;

  int weights[n];

  long long int values[n];

  long long int cur;

  for (int i = 0; i < n; i++) {

    cin >> cur;

    weights[i] = cur;

    cin >> cur;

    values[i] = cur;

  }

  long long int dp[n+1][(1000*n)+1];

  //dp[n][v] represents the minimum weight needed to get value v and only using items with number up to n.

  for (int i = 0; i < n+1; i++) {

    dp[i][0] = 0;

    for (int j = 1; j < (1000*n)+1; j++) {

      dp[i][j] = w+1;

    }

  }

  for (int minInd = 0; minInd < n; minInd++) {

    for (int wanted = 0; wanted < (1000*n); wanted++) {

      dp[minInd+1][wanted] = min(dp[minInd+1][wanted], dp[minInd][wanted]);

      if (dp[minInd][wanted]+weights[minInd] <= w) {

	dp[minInd+1][wanted+values[minInd]] = min(dp[minInd+1][wanted+values[minInd]], dp[minInd][wanted]+weights[minInd]);

      }

    }

  }

  for (int i = (1000*n); i > 0; i--) {

    if (dp[n][i] <= w) {

      cout << i << "\n";

      break;

    }

  }

  return 0;

}

// Faster C++ solution for the same problem (measured speedup: 1.2234110842046357x):
#include<iostream>

#define ll long long int

using namespace std;

ll n, mCap;

ll b[110], v[110];

ll memo[110][110000];

ll totposs = 0;

ll dp(){

	for(ll i = 0;i<=n;i++){

		for(ll j = 1;j<=totposs;j++){

			memo[i][j] = 1e15;

		}

	}

	

	for(ll i = 1;i<=n;i++){

		for(ll j = 1;j<=totposs;j++){

			if(j - v[i-1] >= 0){

//				cout<<"in\n";

				memo[i][j] = 

					min(memo[i-1][j],

						memo[i-1][j-v[i-1]] + b[i-1]

					);

			}else{

				memo[i][j] = memo[i-1][j];

			}

		}

	}

	ll ans = 0;

	for(ll i = 1;i<=n;i++){

		for(ll j = 1;j<=totposs;j++){

			if(memo[i][j]<=mCap){

				ans = max(ans, j);

			}

//			cout<<memo[i][j]<<" ";

		}//cout<<"\n";

	}

	

	return ans;

}



int main(){

	cin>>n>>mCap;

	

	for(ll i = 0;i<n;i++){

		cin>>b[i]>>v[i];

		totposs+=v[i];

	}

	cout<<dp()<<"\n";

	return 0;

}
// Slower C++ solution:
#include <bits/stdc++.h>

using namespace std;



#define pb push_back

#define mk make_pair

#define fi first

#define se second

#define eb emplace_back



typedef long long ll;

typedef pair<int,int> ii;

typedef vector< pair<int,int> > vii;

const ll INF = 0x3f3f3f3f3f3fef;



const int V = 1e5+2;

const int N = 102;



ll dp[V];

ll p[N];

ll v[N];

ll n,w;

 

int main() {

    ios_base::sync_with_stdio(false);

    for(int i = 0; i < V; i++) dp[i] = INF;



    cin >> n >> w;

    for(int i = 0; i < n; i++) cin >> p[i] >> v[i];

    

    dp[0] = 0;



    for(int i = 0; i < n; i++) 

        for(ll j = V-1; j-v[i] >= 0; j--)

            dp[j] = min(dp[j], dp[j-v[i]]+p[i]);



    for(int i = V-1; i >= 0; i--)

        if(dp[i] <= w) { cout << i << endl; return 0; }





    return 0;

}




// Faster C++ solution for the same problem (measured speedup: 2.551676639747559x):
#include<iostream>

#define ll long long int

using namespace std;

ll n, mCap;

ll b[110], v[110];

ll memo[110][110000];

ll totposs = 0;

ll dp(){

	for(ll i = 0;i<=n;i++){

		for(ll j = 1;j<=totposs;j++){

			memo[i][j] = 1e15;

		}

	}

	

	for(ll i = 1;i<=n;i++){

		for(ll j = 1;j<=totposs;j++){

			if(j - v[i-1] >= 0){

//				cout<<"in\n";

				memo[i][j] = 

					min(memo[i-1][j],

						memo[i-1][j-v[i-1]] + b[i-1]

					);

			}else{

				memo[i][j] = memo[i-1][j];

			}

		}

	}

	ll ans = 0;

	for(ll i = 1;i<=n;i++){

		for(ll j = 1;j<=totposs;j++){

			if(memo[i][j]<=mCap){

				ans = max(ans, j);

			}

//			cout<<memo[i][j]<<" ";

		}//cout<<"\n";

	}

	

	return ans;

}



int main(){

	cin>>n>>mCap;

	

	for(ll i = 0;i<n;i++){

		cin>>b[i]>>v[i];

		totposs+=v[i];

	}

	cout<<dp()<<"\n";

	return 0;

}
// Slower C++ solution:
#include<bits/stdc++.h>

using namespace std;

typedef long long int ll;

const int MAX=1e5+10;

ll dp[MAX];

int main (){

    int N,W;cin >> N >> W;

    memset(dp,63,sizeof dp);

    dp[0]=0;

    for(int i=0;i<N;i++){

        int w,val;

        cin >> w >> val;

        for(int j=MAX;j>=0;j--){

            if(j-val>=0)

                dp[j]=min(dp[j],dp[j-val]+w);

        }



    }

    int res=0;

    for(int i=0;i<MAX;i++){

        if(dp[i]<=W) res = max(res,i);

    }

    cout<<res<<endl;

    return 0;

}


// Faster C++ solution for the same problem (measured speedup: 2.9774456120033745x):
#include <bits/stdc++.h>

 

#define ull unsigned long long

#define ll long long

#define pb push_back

#define mp make_pair

#define y1 my_y1

#define fi first

#define se second

#define lcm mylcm

 

using namespace std;

 

const ll mod = 1e9 + 7;

const ll inf = 1e15;

const int N = 1e5 + 5;



ll n, m, w[N], v[N], sum, dp[105][N];



int main () {

	//freopen("a.out", "w", stdout);

    cin.tie(NULL);

	cout.tie(NULL);

	ios_base::sync_with_stdio(false);

	cin >> n >> m;

	for (int i = 1; i <= n; i++) {

		cin >> w[i] >> v[i];

		sum += v[i];

	}

	for (int i = 0; i <= n; i++) {

		for (int j = 1; j <= sum; j++) dp[i][j] = inf;

	}

	for (int i = 1; i <= n; i++) {

		for (int j = 1; j <= sum; j++) {

			dp[i][j] = dp[i - 1][j];

			if (j >= v[i]) {

				dp[i][j] = min(dp[i][j], dp[i - 1][j - v[i]] + w[i]);

			}

			//cout << dp[i][j] << ' ';

		}

		//cout << endl;

	}

	for (int i = sum; i >= 0; i--) {

		//cout << dp[n][i] << endl;

		if (dp[n][i] <= m) {

			cout << i;

			return 0;

		}

	}

	return 0;

}
// Slower C++ solution:
#include <bits/stdc++.h>

using namespace std;



#define pb push_back

#define mk make_pair

#define fi first

#define se second

#define eb emplace_back



typedef long long ll;

typedef pair<int,int> ii;

typedef vector< pair<int,int> > vii;

const ll INF = 0x3f3f3f3f3f3fef;



const int V = 1e5+2;

const int N = 102;



ll dp[V];

ll p[N];

ll v[N];

ll n,w;

 

int main() {

    ios_base::sync_with_stdio(false);

    for(int i = 0; i < V; i++) dp[i] = INF;



    cin >> n >> w;

    for(int i = 0; i < n; i++) cin >> p[i] >> v[i];

    

    dp[0] = 0;



    for(int i = 0; i < n; i++) 

        for(ll j = V-1; j-v[i] >= 0; j--)

            dp[j] = min(dp[j], dp[j-v[i]]+p[i]);



    for(int i = V-1; i >= 0; i--)

        if(dp[i] <= w) { cout << i << endl; return 0; }





    return 0;

}




// Faster C++ solution for the same problem (measured speedup: 2.5243866208253283x):
#include <bits/stdc++.h>

 

#define ull unsigned long long

#define ll long long

#define pb push_back

#define mp make_pair

#define y1 my_y1

#define fi first

#define se second

#define lcm mylcm

 

using namespace std;

 

const ll mod = 1e9 + 7;

const ll inf = 1e15;

const int N = 1e5 + 5;



ll n, m, w[N], v[N], sum, dp[105][N];



int main () {

	//freopen("a.out", "w", stdout);

    cin.tie(NULL);

	cout.tie(NULL);

	ios_base::sync_with_stdio(false);

	cin >> n >> m;

	for (int i = 1; i <= n; i++) {

		cin >> w[i] >> v[i];

		sum += v[i];

	}

	for (int i = 0; i <= n; i++) {

		for (int j = 1; j <= sum; j++) dp[i][j] = inf;

	}

	for (int i = 1; i <= n; i++) {

		for (int j = 1; j <= sum; j++) {

			dp[i][j] = dp[i - 1][j];

			if (j >= v[i]) {

				dp[i][j] = min(dp[i][j], dp[i - 1][j - v[i]] + w[i]);

			}

			//cout << dp[i][j] << ' ';

		}

		//cout << endl;

	}

	for (int i = sum; i >= 0; i--) {

		//cout << dp[n][i] << endl;

		if (dp[n][i] <= m) {

			cout << i;

			return 0;

		}

	}

	return 0;

}
// Slower C++ solution:
//by Top1

#include <bits/stdc++.h>

     

#define f first

#define s second

#define int long long

#define ld long double

#define ull unsigned long long

#define pii pair <int, int>

#define pll pair <long, long>

#define mp make_pair

#define pb push_back

#define pf push_front

#define pp pop_back

#define rev reverse

#define all(s) s.begin(), s.end()

#define sz(s) (int)s.size()

#define forn(i, a, b) for (int i = a; i <= b; i++)

#define boost ios_base::sync_with_stdio(false); cin.tie(0),cout.tie(0);

#define nxtp next_permutation

#define pvtp prev_permutation

#define KZ return 

#define x1 x21212121

#define y1 y21212121

#define sqr(x) x * x 

 

const int inf = (1e9) + 1;

const int mod = 1e9 + 7;

const int maxn = 1e5 + 111;

     

using namespace std;



int q, n, w, a[maxn], b[maxn], dp[105][maxn], ans;



void solve(){    

	cin >> n >> w;



	for (int i = 1; i <= n; i++)

		cin >> a[i] >> b[i];



	for (int i = 0; i <= n; i++)

		for (int j = 1e5; j >= 0; j--)

			dp[i][j] = inf;



	dp[0][0] = 0;



	for (int i = 1; i <= n; i++){

		for (int j = 1e5; j >= 0; j--){

			dp[i][j] = dp[i - 1][j];

			if (j - b[i] >= 0)

				dp[i][j] = min(dp[i][j], dp[i - 1][j - b[i]] + a[i]);

			if (dp[i][j] <= w)

				ans = max(ans, j);

		}

		/*for (int j = 1; j <= 20; j++)

			cout << dp[i][j] << " ";

		cout << endl;	*/

		//cout << dp[i][100000] << endl;

	}



	//cout << dp[n][100000] << " ";



	/*for (int i = 0; i <= w; i++)

		cout << dp[i] << " ";

	*/

	cout << ans;

}



main(){

    boost;

	    

	q = 1;



	while (q--){

		solve();

	}

}

// Faster C++ solution for the same problem (measured speedup: 7.226762057842412x):
#include <bits/stdc++.h>

 

#define ull unsigned long long

#define ll long long

#define pb push_back

#define mp make_pair

#define y1 my_y1

#define fi first

#define se second

#define lcm mylcm

 

using namespace std;

 

const ll mod = 1e9 + 7;

const ll inf = 1e15;

const int N = 1e5 + 5;



ll n, m, w[N], v[N], sum, dp[105][N];



int main () {

	//freopen("a.out", "w", stdout);

    cin.tie(NULL);

	cout.tie(NULL);

	ios_base::sync_with_stdio(false);

	cin >> n >> m;

	for (int i = 1; i <= n; i++) {

		cin >> w[i] >> v[i];

		sum += v[i];

	}

	for (int i = 0; i <= n; i++) {

		for (int j = 1; j <= sum; j++) dp[i][j] = inf;

	}

	for (int i = 1; i <= n; i++) {

		for (int j = 1; j <= sum; j++) {

			dp[i][j] = dp[i - 1][j];

			if (j >= v[i]) {

				dp[i][j] = min(dp[i][j], dp[i - 1][j - v[i]] + w[i]);

			}

			//cout << dp[i][j] << ' ';

		}

		//cout << endl;

	}

	for (int i = sum; i >= 0; i--) {

		//cout << dp[n][i] << endl;

		if (dp[n][i] <= m) {

			cout << i;

			return 0;

		}

	}

	return 0;

}
// Slower C++ solution:
#include<bits/stdc++.h>

using namespace std;

typedef long long int ll;

const int MAX=1e5+10;

ll dp[MAX];

int main (){

    int N,W;cin >> N >> W;

    memset(dp,63,sizeof dp);

    dp[0]=0;

    for(int i=0;i<N;i++){

        int w,val;

        cin >> w >> val;

        for(int j=MAX;j>=0;j--){

            if(j-val>=0)

                dp[j]=min(dp[j],dp[j-val]+w);

        }



    }

    int res=0;

    for(int i=0;i<MAX;i++){

        if(dp[i]<=W) res = max(res,i);

    }

    cout<<res<<endl;

    return 0;

}


// Faster C++ solution for the same problem (measured speedup: 1.1424988982586792x):
#include <bits/stdc++.h>



using namespace std;



#define loop(i, n) for(int i = 0;i < int(n);i++)

#define rloop(i, n) for(int i = int(n);i >= 0;i--)

#define range(i, a, b) for(int i = int(a);i <= int(b);i++)

#define SZ(c) int(c.size())

#define ALL(c) c.begin(), c.end()

#define RALL(c) c.rbegin(), c.rend()

#define PI acos(-1)

#define pb push_back

#define mp make_pair

#define fr first

#define sc second

#define sfi1(v) scanf("%d",&v)

#define sfi2(v1, v2) scanf("%d %d",&v1,&v2)

#define sfi3(v1, v2, v3) scanf("%d %d %d",&v1,&v2,&v3)

#define sfll1(v) scanf("%I64d",&v);

#define sfll2(v1, v2) scanf("%I64d %I64d",&v1,&v2)

#define sfll3(v1, v2, v3) scanf("%I64d %I64d %I64d",&v1,&v2,&v3)

#define endl '\n'



typedef vector<int> vi;

typedef vector<pair<int, int> > vii;

typedef long long ll;

typedef pair<int, int> pii;



const int N = 105;

const int V = 1e5 + 5;

int dp[2][V];

int w[N], v[N];

int n, W;





int main() {



#ifndef ONLINE_JUDGE

//    freopen("in.in", "r", stdin);

    //freopen("out.in", "w", stdout);

#endif

    ios_base::sync_with_stdio(0);

    cin.tie(0);

    cout.tie(0);



    cin >> n >> W;

    range(i, 1, V - 1)dp[n & 1][i] = W + 2;



    loop(i, n)cin >> w[i] >> v[i];



    rloop(i, n - 1) {

        loop(j, V) {

            dp[i & 1][j] = dp[i & 1 ^ 1][j];

            if (j >= v[i])dp[i & 1][j] = min(dp[i & 1][j], dp[i & 1 ^ 1][j - v[i]] + w[i]);

        }

    }



    int ans = 0;

    rloop(i, V - 1) {

        if (dp[0][i] <= W) {

            ans = i;

            break;

        }

    }



    cout << ans << endl;



    return 0;

}
// Slower C++ solution:
#include<bits/stdc++.h>

using namespace std;

typedef long long int ll;

const int MAX=1e5+10;

ll dp[MAX];

int main (){

    int N,W;cin >> N >> W;

    memset(dp,63,sizeof dp);

    dp[0]=0;

    for(int i=0;i<N;i++){

        int w,val;

        cin >> w >> val;

        for(int j=MAX;j>=0;j--){

            if(j-val>=0)

                dp[j]=min(dp[j],dp[j-val]+w);

        }



    }

    int res=0;

    for(int i=0;i<MAX;i++){

        if(dp[i]<=W) res = max(res,i);

    }

    cout<<res<<endl;

    return 0;

}


// Faster C++ solution for the same problem (measured speedup: 1.1678500180576592x):
// @author: Amirul Islam



#include <bits/stdc++.h>

using namespace std;

#define LLI long long int

#define PII pair <int, int>



const int mx = 1e5+5;

const LLI INF = 1e10;



LLI dp[mx], w, val, N, W;



LLI max(LLI a, LLI b) {

    return (a > b ? a : b);

}



LLI knapsack(int N, int W) {

    for (int i = 0; i < mx; i++) dp[i] = INF;

    dp[0] = 0;

    for (int i = 1; i <= N; i++) {

        scanf("%lld %lld", &w, &val);

        for (int j = mx; j >= 0; j--) {

            if (j >= val) dp[j] = min(dp[j], dp[j-val] + w);

        }

    }

    LLI ret = 0;

    for (int i = 0; i < mx; i++) {

        if (dp[i] <= W) ret = max(ret, i);

    }

    return ret;

} 



int main() {

    scanf("%lld %lld", &N, &W);

    printf("%lld\n", knapsack(N, W));

    return 0;

}