#nullable enable #region var (_input, _iter) = (Array.Empty(), 0); T I() where T : IParsable { while (_iter >= _input.Length) (_input, _iter) = (Console.ReadLine()!.Split(' '), 0); return T.Parse(_input[_iter++], null); } #endregion static T[] Range(int n, Func F) => Enumerable.Range(0, n).Select(_ => F()).ToArray(); var n = I(); var h = I(); var vz = Range(n, I); var wz = Range(n, I); Array.Reverse(vz); Array.Reverse(wz); var min = int.MinValue / 2; var dp = new (int, int)[n + 1, h + 1]; for (var i = 0; i <= n; i++) for (var j = 0; j <= h; j++) dp[i, j] = (min, -1); dp[0, 0] = (0, -1); for (var i = 0; i < n; i++) { for (var j = 0; j <= h; j++) dp[i + 1, j] = dp[i, j]; var v = vz[i]; var w = wz[i]; for (var j = 0; j <= h; j++) { var nv = v + dp[i, j].Item1; var nw = j + w; if (nw > h) break; var (cv, ci) = dp[i + 1, nw]; if (cv < nv || (cv == nv && ci > i)) dp[i + 1, nw] = (nv, i); } } var maxv = -1; var maxi = int.MaxValue; var curw = -1; for (var i = 0; i <= h; i++) { var (v, k) = dp[n, i]; if (maxv < v) (maxv, maxi, curw) = (v, k, i); else if (maxv == v && k < maxi) (maxi, curw) = (k, i); } var ans = new List(); var z = n; while (true) { var (_, k) = dp[z, curw]; if (k < 0) break; ans.Add(n - k); z = k; curw -= wz[k]; } Console.WriteLine(ans.Count); Console.WriteLine(string.Join(' ', ans));