nq1s788

рюкзак с восстановлением ответа

Jan 18th, 2026
122
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 0.76 KB | None | 0 0
  1. vector<vector<pair<int>>> p(n + 1, vector<int>(M + 1))
  2. for (int i = 1; i <= n; i++) {
  3.     for (int s = 0; s <= M; s++) {
  4.         if (w[i - 1] < s) {
  5.             dp[i][s] = dp[i - 1][s];
  6.             continue;
  7.         }
  8.         if (dp[i - 1][s] > dp[i - 1][s - w[i - 1]] + cost[i - 1]) {
  9.               p[i][s] = {i - 1, s};
  10.               dp[i][s] = dp[i - 1][s];
  11.         } else {
  12.               p[i][s] = {i - 1, s - w[i - 1]};
  13.               dp[i][s] = dp[i - 1][s - w[i - 1]] + cost[i - 1];
  14.         }
  15.     }
  16. }
  17. vector<int> answ;
  18. pair<int, int> cur = {n, m};
  19. while (cur.fi != 0) {
  20.     if (cur.se != p[cur.fi][cur.se].se) {
  21.         answ.push_back(cur.fi);
  22.     }
  23.     cur = p[cur.fi][cur.se];
  24. }
  25. cout << dp[n][m] << '\n';
  26. for (auto e : answ) cout << e << ' ';
Advertisement
Add Comment
Please, Sign In to add comment