#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; using ll = long long; using P = pair; constexpr int INF = 1001001001; // constexpr int mod = 1000000007; constexpr int mod = 998244353; template inline bool chmax(T& x, T y){ if(x < y){ x = y; return true; } return false; } template inline bool chmin(T& x, T y){ if(x > y){ x = y; return true; } return false; } int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); int N, X; cin >> N >> X; vector A(N), B(N); for(int i = 0; i < N; ++i) cin >> A[i]; for(int i = 0; i < N; ++i) cin >> B[i]; // 平均が X 以上となる条件 : \sum(A-X)>=0 // A-X>=0 ならば算出対象に入れる // S = A-X(>=0) の総和 // costsum = (A-X<0) なる B の総和 int S = 0, costsum = 0; vector

dat; for(int i = 0; i < N; ++i){ if(A[i] - X >= 0) S += A[i] - X; else{ dat.emplace_back(X - A[i], B[i]); costsum += B[i]; } } // すべて A-X<0 なら -1 if((int)dat.size() == N){ cout << -1 << endl; return 0; } // dp[s] := A-X(<0) の総和が -s のときの B の総和の最大値 vector dp(S + 1, -1); dp[0] = 0; for(auto [C, D] : dat){ for(int i = S - C; i >= 0; --i){ if(dp[i] != -1) chmax(dp[i + C], dp[i] + D); } } cout << costsum - *max_element(begin(dp), end(dp)) << endl; return 0; }