Pagini recente » Cod sursa (job #666769) | Cod sursa (job #1514490) | Cod sursa (job #1593879) | Cod sursa (job #1065587) | Cod sursa (job #596225)
Cod sursa(job #596225)
#include <cstring>
#include <fstream>
using namespace std;
int N, G, Z[18];
int maxS[1 << 17], minC[1 << 17];
int main()
{
ifstream fin("zebughil.in");
ofstream fout("zebughil.out");
for (int step = 1; step <= 3; ++step)
{
fin >> N >> G;
for (int i = 1; i <= N; ++i)
fin >> Z[i];
memset(maxS, -1, sizeof(maxS));
memset(minC, 0, sizeof(minC));
maxS[0] = G, minC[0] = 1;
for (int i = 1; i < (1 << N); ++i)
for (int j = 0; j < N; ++j)
if (i & (1 << j))
{
if (maxS[i ^ (1 << j)] >= Z[j + 1] && (maxS[i] == -1 || minC[i ^ (1 << j)] < minC[i] || (minC[i ^ (1 << j)] == minC[i] && maxS[i ^ (1 << j)] - Z[j + 1] > maxS[i])))
{
maxS[i] = maxS[i ^ (1 << j)] - Z[j + 1];
minC[i] = minC[i ^ (1 << j)];
}
else if (maxS[i ^ (1 << j)] < Z[j + 1] && (maxS[i] == -1 || minC[i ^ (1 << j)] + 1 < minC[i] || (minC[i ^ (1 << j)] + 1 == minC[i] && G - Z[j + 1] > maxS[i])))
{
maxS[i] = G - Z[j + 1];
minC[i] = minC[i ^ (1 << j)] + 1;
}
}
fout << minC[(1 << N) - 1] << '\n';
}
fin.close();
fout.close();
}