#include #include #include #include #include #include using namespace atcoder; using namespace std; using ll = long long; using ull = unsigned long long; template using max_heap = priority_queue; template using min_heap = priority_queue, greater<>>; ll ll_min = numeric_limits::min(); ll ll_max = numeric_limits::max(); ll ALPHABET_N = 26; using mint = modint998244353; #define rep(i, n) for (ll i = (ll)0; i < (ll)n; i++) #define rep_(i, k, n) for (ll i = (ll)k; i < (ll)n; i++) #define all(a) a.begin(), a.end() int main() { ios::sync_with_stdio(false); cin.tie(nullptr); ll n, mx_w; cin >> n >> mx_w; vector V(n), W(n); rep(i, n) cin >> V[i]; rep(i, n) cin >> W[i]; // i番目まで見て,重さw以下の最大価値 vector dp(n, vector(mx_w + 1, make_pair(0, -1LL))); for (ll cw = W.back(); cw <= mx_w; cw++) { dp.back()[cw] = {V.back(), n - 1}; } for (ll i = n - 2; i >= 0; i--) { ll v = V[i]; ll w = W[i]; for (ll cw = 0; cw <= mx_w; cw++) { dp[i][cw] = dp[i + 1][cw]; ll pw = cw - w; if (pw < 0) continue; auto &[mx_v, by] = dp[i][cw]; if (mx_v < dp[i + 1][pw].first + v) { mx_v = dp[i + 1][pw].first + v; by = i; } } } vector ans; ll p = 0; ll cw = mx_w; while (true) { auto [mx_v, by] = dp[p][cw]; if (by == -1) break; ans.push_back(by + 1); cw = cw - W[by]; p = by + 1; } cout << ans.size() << endl; rep(i, ans.size()) cout << ans[i] << " \n"[i == ans.size() - 1]; return 0; }