Pagini recente » Cod sursa (job #617653) | Cod sursa (job #46819) | Cod sursa (job #3196462) | Cod sursa (job #2986097) | Cod sursa (job #2121460)
#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;
}