Pagini recente » Cod sursa (job #2057879) | Cod sursa (job #2806944) | Cod sursa (job #1251544) | Cod sursa (job #3256751) | Cod sursa (job #2121446)
#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;
}