```
#include<iostream>
using namespace std;
const int N = 1e3 + 10;
int a[N], b[N], n, m;
double f[N][N], c[N];
bool check(double x)
{
for (int i = 1; i <= n; i++) {
c[i] = b[i] - x * a[i];
}
for (int i = 0; i <= n; i++) {
for (int j = 0; j <= m; j++) {
f[i][j] = -0x3f3f3f3f;
}
}
//for (int i = 1; i <= m; i++) f[0][i] = 0;
f[0][0] = 0;
for (int i = 1; i <= n; i++) {
for (int j = 0; j <= m; j++) {
//不选
f[i][j] = max(f[i][j],f[i - 1][j]);
//选
if (j + a[i] >= m) {
f[i][m] = max(f[i][m], f[i - 1][j] + c[i]);
}
else {
f[i][j + a[i]] = max(f[i][j + a[i]], f[i - 1][j] + c[i]);
}
}
}
return f[n][m] >= 0;
}
int main()
{
cin >> n >> m;
for (int i = 1; i <= n; i++) {
cin >> a[i] >> b[i];
}
double l = 0, r = 1e6;
while (r - l > 1e-5) {
double mid = (l + r) / 2.0;
if (check(mid)) l = mid;
else r = mid;
}
cout << int(r * 1000) << endl;
return 0;
}
```
by Man_CCNU @ 2023-04-28 14:33:04