Cod sursa(job #2664602)

Utilizator cristi_macoveiMacovei Cristian cristi_macovei Data 28 octombrie 2020 22:50:52
Problema Energii Scor 45
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.08 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <cassert>

const int NMAX = 1e3;
const int COST_MAX = 5e3;

int n, target, energySum, costSum;
int e[1 + NMAX], c[1 + NMAX];
int dp[2][1 + NMAX * COST_MAX];

void read() {
  std::ifstream in("energii.in");

  in >> n >> target;

  for (int i = 1; i <= n; ++i) {
    in >> e[i] >> c[i];
    energySum += e[i];
    costSum += c[i];
  }

  in.close();
}

int main() {
  read();

  std::ofstream out("energii.out");

  if (energySum < target) {
    out << "-1\n";
    out.close();
    return 0;
  }

  // dp[i][j] = energia maxima cu cost j din primele i generatoare

  int lin = 1;
  for (int i = 1; i <= n; ++i, lin = 1 - lin) {
    for (int j = 1; j <= costSum; ++j) {
      dp[lin][j] = dp[1 - lin][j];

      if (j >= c[i] && dp[1 - lin][j - c[i]] + e[i] > dp[lin][j])
        dp[lin][j] = dp[1 - lin][j - c[i]] + e[i];
    }
  }

  for (int cost = 1; cost <= costSum; ++cost) {
    if (dp[1 - lin][cost] >= target) {
      out << cost << '\n';

      out.close();
      return 0;
    }
  }

  assert(true);
  out.close();
  return 0;
}