Cod sursa(job #602383)

Utilizator mihaipopa12Popa Mihai mihaipopa12 Data 11 iulie 2011 11:48:03
Problema Zebughil Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.13 kb
#include<stdio.h>

#define maxN 19

FILE*f=fopen("zebughil.in","r");
FILE*g=fopen("zebughil.out","w");

int n,G,i,A[maxN],bst[(1<<(maxN-1))][maxN],t,j,ii;

inline void citire () {
	
	fscanf(f,"%d %d",&n,&G);
	for ( i = 0 ; i < n ; ++i ){
		fscanf(f,"%d",&A[i]);
	}
}

inline int max ( int a , int b ){
	if ( a > b )
		return a;
	return b;
}

inline void solve () {
	
	for ( i = 0 ; i < (1<<n) ; ++i ){
		for ( j = 1 ; j <= n ; ++j ){
			bst[i][j] = -1;
		}
	}
	
	bst[0][1] = G;
	
	for ( i = 0 ; i < (1<<n) ; ++i ){
		for ( j = 1 ; j <= n ; ++j ){
			if ( bst[i][j] == -1 )	continue ;
			for ( ii = 0 ; ii < n ; ++ii ){
				if ( i & (1 << ii) )	continue ;
				if ( A[ii] > bst[i][j] ){
					bst[i|(1<<ii)][j+1] = max( bst[i|(1<<ii)][j+1] , G - A[ii] ); 
				}
				else{
					bst[i|(1<<ii)][j] = max( bst[i|(1<<ii)][j], bst[i][j] - A[ii] );
				}
			}				
		}
	}
	
	for ( j = 1 ; j <= n ; ++j ){
		if ( bst[(1<<n)-1][j] != -1 ){
			fprintf(g,"%d\n",j);
			break;
		}
	}
}

int main () {
	
	for ( t = 1 ; t <= 3 ; ++t ){
		citire();
		solve();
	}
	
	fclose(f);
	fclose(g);
	
	return 0;
}