Cod sursa(job #1561410)

Utilizator StarGold2Emanuel Nrx StarGold2 Data 4 ianuarie 2016 01:01:50
Problema Zebughil Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.8 kb
#include <cstdio>
#include <algorithm>
#include <cstring>

const int DIM = 17;
const long long INF = 40000000000LL;
using namespace std;

int V[DIM + 1], P[1 << DIM], W[DIM + 1], N, G, K;
int val, val2; long long val3, D[1 << DIM][DIM + 1];

int main () {

    freopen( "zebughil.in" ,"r", stdin  );
    freopen( "zebughil.out","w", stdout );

    for( int i = 0; i < 17; i ++ )
        P[1 << i] = i;

    for( int t = 1; t <= 3; t ++ ) {
        scanf( "%d %d", &N, &G );

        for( int i = 0; i < N; i ++ )
            scanf( "%d", &V[i] );

        for( int i = 1; i < (1 << N); i ++ ) {
           K = 0; val = i;

            while( val ) {
                W[K++] = P[(val & (-val))];
                val -= (val & (-val));
            }

            for( int j = 1; j <= N; j ++ ) {
                D[i][j] = -INF;

                if( j == 1) {
                    val = 0;

                    for( int k = 0; k < K; k ++ )
                        val += V[P[W[k]]];

                    D[i][j] = G - val;
                    continue;
                }

                for( int k = 0; k < (1 << K); k ++ ) {
                    val = k; val2 = 0; val3 = 0;

                    while( val ) {
                        val3 += V[W[P[(val & (-val))]]];
                        val2 += (val & (-val));
                        val -= (val & (-val));
                    }

                    if( D[i - val2][j - 1] >= 0 && D[i][j] < G - val3)
                        D[i][j] = G - val3;
                }
            }
        }

        for( int j = 1; j <= N; j ++ ) {
            if( D[(1 << N) - 1][j] >= 0) {
                printf( "%d\n", j );
                break;
            }
        }

        memset( D, 0, sizeof( D ) );
    }


    return 0;
}