Cod sursa(job #1096451)

Utilizator toranagahVlad Badelita toranagah Data 2 februarie 2014 00:58:05
Problema Zebughil Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.23 kb
#include <algorithm>
#include <fstream>
#include <iostream>
using namespace std;

ifstream fin("zebughil.in");
ofstream fout("zebughil.out");

const int MAX_N = 20;
const int INF = 1 << 30;

int N, G;
int z[MAX_N];
pair<int, int> d[1 << MAX_N];

int solve();

int main() {
    for (int t = 0; t < 3; t += 1) {
        fin >> N >> G;
        for (int i = 0; i < N; i += 1) {
            fin >> z[i];
        }

        for (int conf = 0; conf < (1 << N); conf += 1) {
            d[conf] = make_pair(INF, 0);
        }
        d[0] = make_pair(1, G);

        fout << solve() << '\n';
    }

}

int solve() {
    for (int conf = 0; conf < (1 << N); conf += 1) {
        if (d[conf].first == INF) continue;
        for (int i = 0; i < N; i += 1) {
            if (conf & (1 << i)) continue;
            int ni, nc, nv;
            nc = conf ^ (1 << i);
            ni = d[conf].first;

            if (d[conf].second - z[i] < 0) {
                ni += 1;
                nv = G - z[i];
            } else {
                nv = d[conf].second - z[i];
            }

            if (ni < d[nc].first || (ni == d[conf].first && nv > d[nc].second)) {
                d[nc] = make_pair(ni, nv);
            }
        }
    }
    return d[(1 << N) - 1].first;
}