背包二维怎么写??

P4377 [USACO18OPEN] Talent Show G

``` #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


|