Cod sursa(job #2121558)

Utilizator Stefan_RaduStefan Radu Stefan_Radu Data 3 februarie 2018 20:50:46
Problema Ghiozdan Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.01 kb
#include <fstream>
#include <vector>

using namespace std;

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

const int INF = 1e9;

int main () {

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

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

  for (int i = 1; i <= n; ++ i) {
    int x;
    cin >> x;
    ++ nr_obj[x];
  }
  
  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 mx = min (nr_obj[i], (g - j) / i);

      for (int k = 1; k <= mx; ++ k) {
        if (dp[j + k * i] != INF) {
          break;
        }

        if (dp[j] + k < dp[j + i * k]) {
          dp[j + i * k] = dp[j] + k;
          pre[j + i * k] = i; 
        }
      }
    }
  }
  
  int ans;
  for (int i = g; i >= 0; -- i) {
    if (dp[i] != INF) {
      cout << i << ' ' << dp[i] << '\n';
      while (pre[i]) {
        cout << pre[i] << '\n';
        i -= pre[i];
      }
      break;
    }
  }
}