#include using namespace std; #define rep(i, n) for (int i = 0; i < (int)(n); i++) int main() { long long N, W; cin >> N >> W; vector> vw(N); rep(i, N) { cin >> vw[i][0]; } rep(i, N) { cin >> vw[i][1]; } reverse(vw.begin(), vw.end()); vector dp(N + 1, vector>(W + 1, {-1, -1})); dp[0][0] = {0, -1}; rep(i, N) rep(now_w, W + 1) { if (dp[i][now_w].first == -1) { continue; } // i番目のアクスタを使わない if (dp[i + 1][now_w].first <= dp[i][now_w].first) { dp[i + 1][now_w] = dp[i][now_w]; } // i番目のアクスタを使う auto [v, w] = vw[i]; long long next_v = dp[i][now_w].first + v; long long next_w = now_w + w; if (next_w <= W && dp[i + 1][next_w].first < next_v) { dp[i + 1][next_w] = {next_v, i}; } } vector ans = {-1}; long long max_v = 0; long long now_w = 0; rep(w, W + 1) { if (max_v < dp[N][w].first) { max_v = dp[N][w].first; now_w = w; ans = {dp[N][w].second}; } else if (max_v == dp[N][w].first && dp[N][w].second <= ans.back()) { max_v = dp[N][w].first; now_w = w; ans = {dp[N][w].second}; } } while (ans.back() != -1) { now_w -= vw[ans.back()][1]; ans.push_back(dp[ans.back()][now_w].second); } ans.pop_back(); cout << ans.size() << endl; for (auto n : ans) { cout << N - n << " "; } cout << endl; return 0; }