//解を持ってdpする //使わなくなったものはclear //MLEするかな #include #include #include using namespace std; using namespace atcoder; using ll = long long; //#define endl "\n"; const long long INF = 1000000000000000000; ll N, W, v[3009], w[3009]; ll dp[3009][3009]; vector dpv[3009][3009]; int main(){ cin >> N >> W; for(int i = 1; i <= N; i++) cin >> v[i]; for(int i = 1; i <= N; i++) cin >> w[i]; for(int i = 0; i <= N; i++){ for(int j = 0; j <= W; j++){ dp[i][j] = -INF; } } dp[N][0] = 0; for(int i = N; i >= 1; i--){ for(int j = 0; j <= W; j++){ if(dp[i][j] == -INF) continue; if(j + w[i] <= W){ if(dp[i - 1][j + w[i]] == dp[i][j] + v[i]){ //前の方が右に寄っている } if(dp[i - 1][j + w[i]] < dp[i][j] + v[i]){ dp[i - 1][j + w[i]] = dp[i][j] + v[i]; dpv[i - 1][j + w[i]] = dpv[i][j]; dpv[i - 1][j + w[i]].push_back(i); } } if(dp[i - 1][j] <= dp[i][j]){ dp[i - 1][j] = dp[i][j]; dpv[i - 1][j] = dpv[i][j]; } dpv[i][j].clear(); } } ll maxval = 0; vector ans; for(int j = 0; j <= W; j++){ if(maxval < dp[0][j]){ maxval = dp[0][j]; ans = dpv[0][j]; } } reverse(ans.begin(), ans.end()); cout << ans.size() << endl; for(auto p: ans) cout << p << " "; cout << endl; return 0; }