Cod sursa(job #2121460)

Utilizator preda.andreiPreda Andrei preda.andrei Data 3 februarie 2018 18:27:22
Problema Zebughil Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <cstdint>
#include <fstream>
#include <vector>

using namespace std;

constexpr int kMaxBlocks = 17;

int sub_cost_memo[(1 << kMaxBlocks)];

inline int Bit(int num, int pos)
{
  return (num & (1 << pos)) ? 1 : 0;
}

int SubCost(int conf, const vector<int> &vec)
{
  if (sub_cost_memo[conf] != 0) {
    return sub_cost_memo[conf];
  }

  int cost = 0;
  for (int i = kMaxBlocks; i >= 0; --i) {
    if (Bit(conf, i) == 1) {
      cost += 1LL * vec[i];
    }
  }
  return sub_cost_memo[conf] = cost;
}

int Solve(const vector<int> &vec, int cap)
{
  auto confs = (1 << vec.size());
  vector<int> cost(confs, vec.size());

  for (int i = 0; i < confs; ++i) {
    sub_cost_memo[i] = 0;
  }

  cost[0] = 0;
  for (int i = 1; i < confs; ++i) {
    if (SubCost(i, vec) <= cap) {
      cost[i] = 1;
      continue;
    }

    int sub = i;
    while (sub > 0) {
      auto reversed = i ^ sub;
      auto new_cost = cost[reversed] + cost[sub];
      cost[i] = min(cost[i], new_cost);
      sub = (sub - 1) & i;
    }
  }
  return cost[confs - 1];
}

int main()
{
  ifstream fin("zebughil.in");
  ofstream fout("zebughil.out");

  for (int i = 0; i < 3; ++i) {
    int blocks, capacity;
    fin >> blocks >> capacity;

    vector<int> vec(blocks);
    for (auto &elem : vec) {
      fin >> elem;
    }

    auto res = Solve(vec, capacity);
    fout << res << "\n";
  }
  return 0;
}