Cod sursa(job #45933)

Utilizator peanutzAndrei Homorodean peanutz Data 2 aprilie 2007 09:33:44
Problema Zebughil Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.05 kb
#include <stdio.h>
#include <string.h>
const int infi=1<<30;
const int nmax=17;
FILE *fin=fopen ("zebughil.in","r");
unsigned n,gmax,g[18];

void read() {
	fscanf (fin,"%d %d",&n,&gmax);
	int i;
	for (i=0;i<n;++i) 
		fscanf (fin,"%d",&g[i]);
}

unsigned best[ 1 << 18 ];
unsigned extra[ 1 << 18 ];

int dinamic() {
	int i,j;
	for (i=0;i< (1<<n);best[i]=infi,++i);
	for (i=0;i<n;++i) {
		best[ 1<<i ]=0;
		extra[ 1<<i ]=g[i];
	}

	for (i=1;i< (1<<n);++i) {
		for (j=0;j<n;++j) 
			if (!(i&(1<<j) ) ) {
				int nc=i|(1<<j);
				int nb,ne;
				if (extra[ i ] + g[j] > gmax ) {
					nb=best[i]+1;
					ne=g[j];
				}
				else {
					ne=extra[i] + g[j];
					nb=best[i];
				}
				if (nb < best[ nc ] || (nb== best[nc] && ne < extra[ nc ]) ) {
					best[ nc ]=nb;
					extra[ nc ]=ne;
				}
			}
		}
	return best[ (1<<n)-1 ] + (extra[ (1<<n)-1 ] > 0);
}

int main() {
	FILE *fout=fopen ("zebughil.out","w");
	int i;
	for (i=1;i<=3;++i) {
		read();
		fprintf(fout,"%d\n",dinamic());
	}
	fclose(fout);
	return 0;
}