#include #include #include using namespace std; const int N = 60; // 价格:i元,最后两次分别编号为j,k的最大长度和 int n, c, li[N], wi[N], ans, dp[N][N][N]; int main() { scanf("%d%d", &n, &c); for (int i = 1; i <= n; ++i) scanf("%d", &li[i]); for (int i = 1; i <= n; ++i) scanf("%d", &wi[i]); memset(dp, 0xcf, sizeof(dp)); for (int i = 1; i <= n; ++i) { for (int j = 1; j <= n; ++j) { if (li[i] == li[j] || wi[i] + wi[j] > c) continue; dp[wi[i] + wi[j]][i][j] = li[i] + li[j]; } } for (int i = 0; i <= c; ++i) { for (int j = 1; j <= n; ++j) { for (int k = 1; k <= n; ++k) { if (li[j] == li[k]) continue; for (int l = 1; l <= n; ++l) { if (li[k] == li[l]) continue; if ((li[j] < li[k] && li[k] > li[l] && li[j] != li[l]) || (li[j] > li[k] && li[k] < li[l] && li[j] != li[l])) { if (i + wi[l] > c || dp[i][j][k] < 0) continue; dp[i + wi[l]][k][l] = max(dp[i + wi[l]][k][l], dp[i][j][k] + li[l]); ans = max(ans, dp[i + wi[l]][k][l]); } } } } } printf("%d\n", ans); return 0; }