Pagini recente » Cod sursa (job #1577028) | Cod sursa (job #2741643) | Cod sursa (job #1239784) | Cod sursa (job #855206) | Cod sursa (job #2121464)
#include <cstdint>
#include <fstream>
#include <vector>
using namespace std;
constexpr int kMaxBlocks = 17;
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 += 1LL * 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;
continue;
}
int sub = i;
while (sub > 0 && sub > (i ^ sub)) {
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;
}