Pagini recente » Cod sursa (job #3206868) | Cod sursa (job #2066008) | Cod sursa (job #2428455) | Cod sursa (job #772015) | Cod sursa (job #1016274)
#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 < 3; ++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;
}