Pagini recente » Cod sursa (job #2820226) | Cod sursa (job #3197736) | Cod sursa (job #1782935) | Cod sursa (job #1396977) | Cod sursa (job #75948)
Cod sursa(job #75948)
# 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;
}