1 /*
2 d[v] = w; ->价值为v时,d[v] = 达到该价值的最小重量
3 */
4 #include<iostream>
5 #include<cstring>
6 using namespace std;
7
8 int d[10005];
9 int maxd,n,maxw,w,v;
10
11 void bag(int w,int v)
12 {
13 if(w > maxw)
14 return ;
15 for(int i=10000; i>v; --i)
16 {
17 if( (d[i-v]>0 && d[i-v]+w < d[i]) || (d[i] == 0 && d[i-v]!=0 && d[i-v]+w <= maxw) )
18 {
19 d[i] = d[i-v]+w;
20 if(i > maxd)
21 maxd = i;
22 }
23 }
24 if(d[v] > w || d[v] == 0)
25 {
26 d[v] = w;
27 if(v > maxd)
28 maxd = v;
29 }
30 }
31
32 int main()
33 {
34 while(cin >> n >> maxw)
35 {
36 memset(d,0,sizeof d);
37 maxd = 0;
38 while(n--)
39 {
40 cin >> w >> v;
41 bag(w,v);
42 }
43 cout << maxd << endl;
44 }
45 return 0;
46 }
47
48
49 //最优代码
50
51 #include <cstdio>
52 #include <cstring>
53 #include <string>
54 #include <queue>
55 #include <algorithm>
56 #include <vector>
57 #include <cmath>
58 #include <iostream>
59 #include <ctime>
60 using namespace std;
61
62 const int N = 1e2+10;
63 const int inf = 1<<30;
64 int n, W, sumV;
65 int w[N], v[N];
66 int dp[N][N*N];
67 void solve()
68 {
69 int i, j;
70 for(j = 1;j <= sumV;j++)
71 dp[0][j] = inf;
72 dp[0][0] = 0;
73 for(i = 1;i <= n;i++)
74 {
75 for(j = 0;j <= sumV;j++)
76 {
77 if(j < v[i])
78 dp[i][j] = dp[i-1][j];
79 else
80 dp[i][j] = min(dp[i-1][j] , dp[i-1][j-v[i]] + w[i]);
81 }
82 }
83 int res = 0;
84 for(i = 0;i <= sumV;i++)
85 if(dp[n][i] <= W)
86 res = i;
87 printf("%d\n", res);
88 }
89 int main()
90 {
91 //freopen("Input.txt","r",stdin);
92 //freopen("Output.txt","w",stdout);
93 int i, j;
94 while(~scanf("%d%d", &n, &W))
95 {
96 sumV = 0;
97 for(i = 1;i <= n;i++)
98 scanf("%d%d", &w[i], &v[i]), sumV += v[i];
99 solve();
100 }
101 }
102