Cod sursa(job #596225)

Utilizator darrenRares Buhai darren Data 16 iunie 2011 15:24:09
Problema Zebughil Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
#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();
}