Cod sursa(job #1834659)

Utilizator depevladVlad Dumitru-Popescu depevlad Data 24 decembrie 2016 21:05:39
Problema Zebughil Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.64 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f("zebughil.in");
ofstream h("zebughil.out");

const int NMAX = 17;

int n, g;
int w[NMAX];
int s[1 << NMAX];
int d[1 << NMAX];
int lg[1 << NMAX];

int main() {
    for (int i = 0; i < NMAX; i++) {
        lg[1 << i] = i;
    }
    for (int t = 1; t <= 3; t++) {
        f >> n >> g;
        for (int i = 0; i < n; i++) {
            f >> w[i];
        }
        s[0] = g;
        d[0] = 1;
        for (int i = 1; i < (1 << n); i++) {
            int bst_n = n;
            int bst_c = g;
            d[i] = n + 1;
            s[i] = 0;
            for (int l = i; l > 0; l -= l & -l) {
                int k = i ^ (l & -l);
                int j = lg[l & -l];
                if (w[j] <= s[k]) {
                    if (d[i] > d[k]) {
                        d[i] = d[k];
                        s[i] = s[k] - w[j];
                    }
                    else {
                        if (d[i] == d[k] && s[i] < s[k] - w[j]) {
                            s[i] = s[k] - w[j];
                        }
                    }
                }
                else {
                    if (bst_n > d[k] + 1) {
                        bst_n = d[k] + 1;
                        bst_c = g - w[j];
                    }
                    else {
                        if (bst_n == d[k] + 1 && bst_c < g - w[j]) {
                            bst_c = g - w[j];
                        }
                    }
                }
            }
            if (d[i] == n + 1) {
                d[i] = bst_n;
                s[i] = bst_c;
            }
        }
        h << d[(1 << n) - 1] << "\n";
    }
    return 0;
}