#pragma GCC optimize("O3") #pragma GCC optimize("unroll-loops") #include static inline constexpr std::vector solve(const uint_least32_t N, const uint_least32_t W, const std::vector& v, const std::vector& w) noexcept { std::array>>, 2> dp = { std::vector>>(W + 1, { 0, std::vector(0) }), std::vector>>(W + 1, { 0, std::vector(0) }) }; for (uint_least32_t i = 0; i != N; ++i) { for (uint_least32_t j = 0; j != w[i]; ++j) dp[(i & 1) ^ 1][j] = dp[i & 1][j]; for (uint_least32_t j = w[i]; j <= W; ++j) { if (dp[i & 1][j].first > dp[i & 1][j - w[i]].first + v[i]) dp[(i & 1) ^ 1][j] = dp[i & 1][j]; else if (dp[i & 1][j].first < dp[i & 1][j - w[i]].first + v[i]) dp[(i & 1) ^ 1][j] = dp[i & 1][j - w[i]], dp[(i & 1) ^ 1][j].first += v[i], dp[(i & 1) ^ 1][j].second.push_back(i + 1); else { std::vector next(dp[i & 1][j - w[i]].second); next.push_back(i + 1); if (dp[i & 1][j].second > next) dp[(i & 1) ^ 1][j] = dp[i & 1][j]; else dp[(i & 1) ^ 1][j] = { dp[i & 1][j - w[i]].first + v[i], std::move(next) }; } } } return dp[N & 1][W].second; } static inline void output(const std::vector& ans) noexcept { std::cout << ans.size() << '\n' << ans[0]; for (uint_least32_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_least32_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; }