Cod sursa(job #677187)

Utilizator nandoLicker Nandor nando Data 9 februarie 2012 21:52:32
Problema Zebughil Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.34 kb
#include <cstdio>
using namespace std;

#define MAXN 18

FILE* fin = fopen("zebughil.in", "r");
FILE* fout = fopen("zebughil.out", "w");

int n, g, w[MAXN], d[1 << MAXN][MAXN];

template <typename T> T max(T a, T b)
{
    return a > b ? a : b;
}

int solve()
{
    for (int i = 0; i < (1 << n); ++i) {
        for (int j = 0; j < n; ++j) {
            d[i][j] = -1;
        }
    }

    d[0][0] = g;

    for (int i = 0; i < (1 << n); ++i) {
        for (int j = 0; j < n; ++j) {
            for (int k = 0; k < n; ++k) {
                if (i & (1 << k) || d[i][j] == -1) {
                    continue;
                }

                if (d[i][j] >= w[k]) {
                    d[i | (1 << k)][j] = max(d[i | (1 << k)][j], d[i][j] - w[k]);
                } else {
                    d[i | (1 << k)][j + 1] = max(d[i | (1 << k)][j], g - w[k]);
                }
            }
        }
    }


    for (int i = 0; i < n; ++i) {
        if (d[(1 << n) - 1][i] != -1) {
            return i + 1;
        }
    }

    return 1;
}

int main()
{
    for (int i = 0; i < 3; ++i) {
        fscanf(fin, "%d %d\n", &n, &g);
        for (int i = 0; i < n; ++i) {
            fscanf(fin, "%d", &w[i]);
        }

        fprintf(fout, "%d\n", solve());
    }

    fclose(fin);
    fclose(fout);
    return 0;
}