Cod sursa(job #1016572)

Utilizator AlexandruValeanuAlexandru Valeanu AlexandruValeanu Data 26 octombrie 2013 14:27:57
Problema Zebughil Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.3 kb
#include <iostream>
#include <fstream>
#include <cstring>

using namespace std;

const int Nmax = 17;

int A[Nmax];
int D[1 << Nmax][Nmax];

int N, G;

int solve()
{
    D[0][0] = G;

    for ( int i = 0; i < ( 1 << N ); ++i )
    {
        for ( int j = 0; j < N; ++j )
        {
            for ( int k = 0; k < N; ++k )
            {
                if ( D[i][j] != -1 && ( ( i & ( 1 << k ) ) == 0 ) )
                {
                    if ( D[i][j] >= A[k] )
                    {
                        D[i | ( 1 << k )][j] = max( D[i | ( 1 << k )][j], D[i][j] - A[k] );
                    }
                    else
                    {
                        D[i | ( 1 << k )][j + 1] = max( D[i | ( 1 << k )][j + 1],G - A[k] );
                    }
                }
            }
        }
    }

    for ( int i = 0; i < N; ++i )
    {
        if ( D[( 1 << N ) - 1][i] != -1 )
        {
            return i + 1;
        }
    }

    return 1;
}

int main()
{
    ifstream f("zebughil.in");
    ofstream g("zebughil.out");

    for ( int k = 0; k < 3; ++k )
    {
        memset( D, -1, sizeof( D ) );

        f >> N >> G;

        for ( int i = 0; i < N; ++i )
                f >> A[i];

        g << solve() << "\n";
    }

    return 0;
}