背包二维怎么写??
查看原帖
背包二维怎么写??
524191
Man_CCNU楼主2023/4/28 11:25
#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 = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++) {
            f[i][j] = -0x3f3f3f3f;
        }
    }
    f[0][0] = 0;
    for (int i = 1; i <= n; i++) {
        for (int j = 0; j <= m; j++) {
            //不选
            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;
}
2023/4/28 11:25
加载中...