Cod sursa(job #1556832)

Utilizator algebristulFilip Berila algebristul Data 26 decembrie 2015 02:02:13
Problema Zebughil Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.08 kb
#include <cstdio>
#include <algorithm>

using namespace std;

const int nmax = 17;
int n, g;
int z[nmax];
int d[(1<<nmax)];
long long s[(1<<nmax)];

inline int msb(int x) {
    return x ^ (x & (x - 1));
}

int main() {
    freopen("zebughil.in", "r", stdin);
    freopen("zebughil.out", "w", stdout);

    int T = 3;

    while(T--) {
        scanf("%d %d", &n, &g);
        for (int i = 0; i < n; i++) {
            scanf("%d", &z[i]);
            s[(1<<i)] = z[i];
        }

        for (int m = 0; m < (1<<n); m++) {
            d[m] = n+1;
            if (m == 0)
                continue;
            if ((m ^ msb(m)) == 0)
                continue;
            s[m] = s[m ^ msb(m)] + s[msb(m)];
        }

        for (int m = 0; m < (1<<n); m++) {
            if (s[m] <= 1LL * g) {
                d[m] = 1;
                continue;
            }

            for (int m1 = m; m1 > 0; m1 = (m1 - 1) & m) {
                d[m] = min(d[m], d[m1] + d[m1 ^ m]);
            }
        }

        printf("%d\n", d[(1<<n)-1]);
    }

    return 0;
}