Cod sursa(job #75948)

Utilizator MarcvsHdrMihai Leonte MarcvsHdr Data 6 august 2007 19:03:28
Problema Zebughil Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.64 kb
# include <stdio.h>

const long int T=3;
const long int MAXN=17;
const long int MAXL=(long int) 1<<MAXN;
long int sp_left[MAXL+1],min_c[MAXL+1];
long int weight[20];
long int coada[MAXL+1],len,n,g;

void init_coada()
{
long int nn=1,p=1;
len=0;
while (nn<=n)
	{
	++len;
	coada[len]=p;
	sp_left[coada[len]]=g-weight[nn];
	min_c[coada[len]]=1;
	p*=2;
	nn++;
	}
}

void scrie(long int sol, FILE *gg)
{
fprintf(gg,"%ld\n",sol);
}

void bf(FILE *gg)
{
init_coada();
long int li=1,nn,p,necod,ne_sp_left,ne_min_c;
while (li<=len)
	{
	for (nn=1,p=1;nn<=n;nn++,p*=2)
		if (!(p&coada[li]))
			{
			necod=coada[li]+p;
			if (sp_left[coada[li]]>=weight[nn])
				{
				ne_min_c=min_c[coada[li]];
				ne_sp_left=sp_left[coada[li]]-weight[nn];
				}
			else
				{
				ne_min_c=min_c[coada[li]]+1;
				ne_sp_left=g-weight[nn];
				}
			if (min_c[necod]==0)
				{
				len++;
				coada[len]=necod;
				min_c[necod]=ne_min_c;
				sp_left[necod]=ne_sp_left;
				}
			else if (min_c[necod]>ne_min_c||(min_c[necod]==ne_min_c&&sp_left[necod]<ne_sp_left))
				{
				min_c[necod]=ne_min_c;
				sp_left[necod]=ne_sp_left;
				}
			}
	li++;
	}
scrie(min_c[((long int)1<<n)-1],gg);
}

void citire(FILE *f)
{
long int i;
fscanf(f,"%ld%ld",&n,&g);
for (i=1;i<=n;i++)
	fscanf(f,"%ld",&weight[i]);
}

void clear_vectors()
{
long int i=1;
while (i<=((long int)1<<n)-1)
	{
	sp_left[i]=0;
	coada[i]=0;
	min_c[i]=0;
	i++;
	}
}

int main()
{
FILE *f=fopen("zebughil.in","r");
FILE *gg=fopen("zebughil.out","w");
long int i;
for (i=1;i<=T;i++)
	{
	citire(f);
	bf(gg);
	clear_vectors();
	}
fcloseall();
return 0;
}