AC 程序:
#include <bits/stdc++.h>
using namespace std;
const int N = 305;
const int M = 1005;
const double eps = 1e-8;
int n, W;
int a[N], b[N];
double dp[M];
bool chk(double x) {
for (int i = 1; i <= W; i++) dp[i] = -1e9;
for (int i = 1; i <= n; i++)
for (int j = W; j >= 0; j--)
dp[min(j + b[i], W)] = max(dp[min(j + b[i], W)], dp[j] + a[i] - x * b[i]);
return dp[W] >= 0;
}
int main() {
cin >> n >> W;
for (int i = 1; i <= n; i++)
cin >> b[i] >> a[i];
double l = 0, r = 1e9;
while (r - l > eps) {
double mid = (l + r) / 2;
if (chk(mid)) l = mid;
else r = mid;
}
cout << (int)(l * 1000);
return 0;
}
但是把二分的代码改成这个就连样例都过不了:
double l = 0, r = 1e9, ans = 0;
while (r - l >= eps) {
double mid = (l + r) / 2;
if (chk(mid)) ans = mid, l = mid + 1;
else r = mid - 1;
}
求问这是为什么?(我平时写的二分都是后面那种)