Cod sursa(job #1016273)

Utilizator AlexandruValeanuAlexandru Valeanu AlexandruValeanu Data 25 octombrie 2013 23:20:17
Problema Zebughil Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.6 kb
#include <iostream>
#include <fstream>
#include <cstring>

using namespace std;

const int Nmax = 17;

int Camion[Nmax];
int Partitii[1 << Nmax];

int N, G;

int lsb( int x )
{
    return ( x & ( -x ) );
}

int partitii( int submultime )
{
    if ( Partitii[submultime] )
            return Partitii[submultime];

    int sum = 0;
    int nr_biti = 0;

    for ( int i = 0; i < N; ++i )
    {
        if ( ( submultime & ( 1 << i ) ) )
        {
            sum += Camion[i];
            nr_biti++;
        }
    }

    if ( sum <= G )
    {
        Partitii[submultime] = 1;
        return 1;
    }

    int solutie = N;
    int sol_posib;
    int subSubmultime, complementara;
    int lungime = ( 1 << nr_biti );
    int contor = 1;

    for ( subSubmultime = ( submultime & ( submultime - 1 ) );
          subSubmultime > 0;
          subSubmultime = ( submultime & ( subSubmultime - 1 ) )
        )
    {
        if ( 2 * contor == lungime ) break;

        contor++;

        complementara = submultime ^ subSubmultime;

        sol_posib = partitii( complementara ) + partitii( subSubmultime );
        solutie = min ( solutie, sol_posib );
    }

    Partitii[submultime] = solutie;

    return solutie;
}

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

    for ( int k = 0; k < 1; ++k )
    {
        f >> N >> G;

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

        g << partitii( ( 1 << N ) - 1 ) << "\n";

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

    return 0;
}