关于此题二分的写法
查看原帖
关于此题二分的写法
731925
happy_zero楼主2023/8/13 18:04

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;
    }

求问这是为什么?(我平时写的二分都是后面那种)

2023/8/13 18:04
加载中...