Cod sursa(job #1989278)

Utilizator mjmilan11Mujdar Milan mjmilan11 Data 6 iunie 2017 18:34:28
Problema Zebughil Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.01 kb
#include <bits/stdc++.h>
using namespace std;
const int NMAX = 17;
const int inf = 0x3f3f3f3f;
int N, G;
int Z[1 << NMAX], DP[1 << NMAX];
unsigned int sum[1 << NMAX];

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

    int i, j;

    while (cin >> N) {
        cin >> G;
        for (i = 0; i < N; ++i)
            cin >> Z[1 << i];
        DP[0] = 0;
        sum[0] = 0;
        for (i = 1; i < (1 << N); ++i) {
            sum[i] = sum[i & (i - 1)] + Z[i ^ (i & (i - 1))];
            if (sum[i] > G)
            sum[i] = G + 1;
        }
        for (i = 1; i < (1 << N); ++i) {
            DP[i] = inf;
            for (j = i & (i - 1); ; j = i & (j - 1)) {
                int diff = i ^ j;
                if (sum[diff] <= G)
                    DP[i] = min(DP[i], DP[j] + 1);
                if (j == 0)
                    break;
            }
        }
        cout << DP[(1 << N) - 1] << '\n';
    }

    return 0;
}