Cod sursa(job #1044590)

Utilizator ELHoriaHoria Cretescu ELHoria Data 30 noiembrie 2013 02:14:58
Problema Zebughil Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 kb
#include <fstream>
#include <cstring>
#include <algorithm>

using namespace std;

int main() 
{
    ifstream cin("zebughil.in");
    ofstream cout("zebughil.out");
    int N, G;
    static unsigned int dp[1 << 17];
    static unsigned int bst[1 << 17];
    static unsigned int sum[1 << 17];
    unsigned int z[17];
    for (int t = 0;t < 3;t++) {
        cin >> N >> G;
        for (int i = 0;i < N;i++) {
            cin >> z[i];
            sum[(1 << i)] = z[i];
        }
        unsigned int total, sumLeft;
        for (int i = 1;i < (1 << N);i++) {
             sum[i] = sum[i ^ (i & -i)] + sum[i & -i] > G ? G + 1 : sum[i ^ (i & -i)] + sum[i & -i];
             if (sum[i] <= G) {
                dp[i] = G - sum[i];
                bst[i] = 1;
                continue;
             }
             bst[i] = N + 1;
             for (int j = 0;j < N;j++) {
                if ((i >> j) & 1) {
                    total = bst[i ^ (1 << j)];
                    if ( z[j] > dp[i ^ ( 1<< j)]) {
                        total++;
                        sumLeft = G - z[j];
                    } else {
                        sumLeft = dp[i ^ (1 << j)] - z[j];
                    }
                    if (total < bst[i] || (total == bst[i] && sumLeft > dp[i])) {
                        bst[i] = total;
                        dp[i] = sumLeft;
                    }
                }
             }
        }
        cout << bst[(1 << N) - 1] << "\n";
    }
    return 0;
}