Cod sursa(job #2121446)

Utilizator preda.andreiPreda Andrei preda.andrei Data 3 februarie 2018 18:04:21
Problema Zebughil Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.15 kb
#include <fstream>
#include <vector>

using namespace std;

constexpr int kMaxBlocks = 18;

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

int SubCost(int conf, const vector<int> &vec)
{
  int cost = 0;
  for (int i = kMaxBlocks; i >= 0; --i) {
    if (Bit(conf, i) == 1) {
      cost += vec[i];
    }
  }
  return cost;
}

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

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

  for (int i = 1; i < confs; ++i) {
    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;
}