Cod sursa(job #2121262)

Utilizator Stefan_RaduStefan Radu Stefan_Radu Data 3 februarie 2018 15:07:24
Problema Ghiozdan Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.07 kb
#include <fstream>
#include <vector>

using namespace std;

ifstream cin ("ghiozdan.in");
ofstream cout ("ghiozdan.out");

const int INF = 1e9;

struct Q_obj {
  int nr, type;
};

int main () {

  int n, g;
  cin >> n >> g;

  vector < int > dp (g + 1, INF), nr_obj (201);

  for (int i = 1; i <= n; ++ i) {
    int x;
    cin >> x;
    ++ nr_obj[x];
  }
  
  vector < vector < Q_obj > > sol (g + 1);
  
  dp[0] = 0;
  for (int i = 200; i >= 1; -- i) {
    if (not nr_obj[i]) {
      continue;
    }

    for (int j = g; j >= 0; -- j) {
      if (dp[j] == INF) {
        continue;
      }

      int k = min ((g - j) / i, nr_obj[i]);

      if (dp[j] + k < dp[j + k * i]) {
        dp[j + k * i] = dp[j] + k;
        sol[j + k * i] = sol[j];
        sol[j + k * i].push_back ({k, i});
      }
    }
  }
  
  int ans;
  for (int i = g; i >= 0; -- i) {
    if (dp[i] != INF) {
      ans = i;
      break;
    }
  }

  cout << ans << ' ' << dp[ans] << '\n';
  for (int i = (int) sol[ans].size () - 1; i >= 0; -- i) {
    while (sol[ans][i].nr --) {
      cout << sol[ans][i].type << '\n';
    }
  }
}