#include static inline constexpr std::vector solve(const uint_fast32_t N, const uint_fast32_t W, const std::vector& v, const std::vector& w) noexcept { std::vector>>> dp(N + 1, std::vector>>(W + 1, { 0, std::vector(0) })); for (uint_fast32_t i = 0; i != N; ++i) { for (uint_fast32_t j = 0; j != w[i]; ++j) dp[i + 1][j] = dp[i][j]; for (uint_fast32_t j = w[i]; j <= W; ++j) { if (dp[i][j].first > dp[i][j - w[i]].first + v[i]) dp[i + 1][j] = dp[i][j]; else if (dp[i][j].first < dp[i][j - w[i]].first + v[i]) dp[i + 1][j] = dp[i][j - w[i]], dp[i + 1][j].first += v[i], dp[i + 1][j].second.push_back(i + 1); else { std::vector next(dp[i][j - w[i]].second); next.push_back(i + 1); if (dp[i][j].second > next) dp[i + 1][j] = dp[i][j]; else dp[i + 1][j] = { dp[i][j - w[i]].first + v[i], std::move(next) }; } } } return dp[N][W].second; } static inline void output(const std::vector& ans) noexcept { std::cout << ans.size() << '\n' << ans[0]; for (uint_fast32_t i = 1; i != ans.size(); ++i) std::cout << ' ' << ans[i]; std::cout << '\n'; } int main() { std::cin.tie(nullptr); std::ios::sync_with_stdio(false); uint_fast32_t N, W, i; std::cin >> N >> W; std::vector v(N), w(N); for (i = 0; i != N; ++i) std::cin >> v[i]; for (i = 0; i != N; ++i) std::cin >> w[i]; output(solve(N, W, v, w)); return 0; }