Cod sursa(job #480261)

Utilizator tamas_iuliaTamas Iulia tamas_iulia Data 27 august 2010 11:37:35
Problema Zebughil Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1 kb
#include <stdio.h>
#define Nmax 18

int din[1<<Nmax],mcam[1<<Nmax];
int v[Nmax];
int n,G;

inline int Maxim(int x,int y){ return x>y ? x:y; }

int main(){
	int i,j,k,t;
	freopen("zebughil.in","r",stdin);
	freopen("zebughil.out","w",stdout);
	for(t=1;t<=3;++t){
		scanf("%d%d",&n,&G);
		for(i=1;i<=n;++i) scanf("%d",&v[i]);
		for(i=0;i<(1<<n);++i) for(j=1;j<=n;++j) din[i]=-1,mcam[i]=n+1;
		din[0]=G; mcam[0]=1;
		
		for(i=0;i<(1<<n);++i)
			for(k=0;k<n;++k)
				if( !(i&(1<<k)) )
					if( din[i] >= v[k+1] )
						if( mcam[i] < mcam[i|(1<<k)] ||
							(mcam[i] == mcam[i|(1<<k)] && din[i]-v[k+1]>din[i|(1<<k)])){
							
							mcam[i|(1<<k)]=mcam[i];
							din[i|(1<<k)]=din[i] - v[k+1];
						}else;
					else 
						if( mcam[i]+1 < mcam[i|(1<<k)]||
							(mcam[i]+1 == mcam[i|(1<<k)] && G-v[k+1]>din[i|(1<<k)]) ){
							mcam[i|(1<<k)]=mcam[i]+1;
							din[i|(1<<k)]=G - v[k+1];
						}
		
		printf("%d\n",mcam[(1<<n)-1]);
	}
	
	fclose(stdin); fclose(stdout);
	return 0;
}