Pagini recente » Cod sursa (job #2376858) | Cod sursa (job #2269182) | Cod sursa (job #420686) | Cod sursa (job #1024084) | Cod sursa (job #1561410)
#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;
}