Cod sursa(job #1834657)

Utilizator depevladVlad Dumitru-Popescu depevlad Data 24 decembrie 2016 20:59:07
Problema Zebughil Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.65 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 main() {
    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 j = 0; j < n; j++) {
                if ((i >> j) & 1) {
                    int k = (i ^ (1 << j));
                    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;
}