/* -*- coding: utf-8 -*- * * 3642.cc: No.3642 OHO SHI KA TSU・・uying ver.・・- yukicoder */ #include #include using namespace std; /* constant */ const int MAX_N = 500; const int MAX_W = 500; const int MAX_C = 500; const int MAX_S = MAX_N * MAX_W * MAX_C; /* typedef */ /* global variables */ int ws[MAX_N], vs[MAX_N], cs[MAX_N]; int dp[MAX_S + 1]; /* subroutines */ void setmax(int &a, int b) { if (a < b) a = b; } /* main */ int main() { int n, x, y; scanf("%d%d%d", &n, &x, &y); for (int i = 0; i < n; i++) scanf("%d%d%d", ws + i, vs + i, cs + i); fill(dp, dp + (MAX_S + 1), -1); dp[0] = 0; for (int i = 0; i < n; i++) { int ci = cs[i]; for (int b = 1; b <= ci; b <<= 1) { int bw = b * ws[i], bv = b * vs[i]; for (int j = MAX_S - bw; j >= 0; j--) if (dp[j] >= 0) setmax(dp[j + bw], dp[j] + bv); ci -= b; } if (ci > 0) { int bw = ci * ws[i], bv = ci * vs[i]; for (int j = MAX_S - bw; j >= 0; j--) if (dp[j] >= 0) setmax(dp[j + bw], dp[j] + bv); } } double maxp = 0.0; for (int j = 1; j <= MAX_S; j++) if (dp[j] >= 0) { int h = dp[j] + (j / x) * y; maxp = max(maxp, (double)h / j); } printf("%.9lf\n", maxp); return 0; }