Pagini recente » Cod sursa (job #673443) | Cod sursa (job #1592262) | Cod sursa (job #18499) | Cod sursa (job #2627526) | Cod sursa (job #397674)
Cod sursa(job #397674)
#include<stdio.h>
#include<string.h>
#define put (1<<18)+5
#define maxim(a,b) (a>b ? a : b)
int n,g,v[19];
short int d[put][19],viz[put][19];
int cond;
int main ()
{
int con,i,j,k,lim,add;
freopen("zebughil.in","r",stdin);
freopen("zebughil.out","w",stdout);
con=3;
for(;con;con--)
{
scanf("%d%d",&n,&g);
cond=0;
for(i=1;i<=n;i++)
{
scanf("%d",&v[i]);
if(v[i])
cond=1;
d[(1<<(i-1))][1]=g-v[i];
viz[(1<<(i-1))][1]=1;
}
lim=(1<<n)-1;
for(i=1;i<=lim && cond;i++)
for(j=1;j<=n;j++)
if(viz[i][j])
for(k=1;k<=n;k++)
{
add=(1<<(k-1));
if(i&add)
continue;
if(d[i][j]-v[k]>=0)
{
if(!viz[i+add][j])
d[i+add][j]=d[i][j]-v[k];
else
d[i+add][j]=maxim(d[i+add][j],d[i][j]-v[k]);
viz[i+add][j]=1;
} //if
else
{
if(!viz[i+add][j+1])
d[i+add][j+1]=g-v[k];
else
d[i+add][j+1]=maxim(d[i+add][j+1],g-v[k]);
viz[i+add][j+1]=1;
}
}
for(i=1;i<=n;i++)
if(viz[lim][i])
break;
if(cond)
printf("%d\n",i);
else
printf("0\n");
memset(viz,0,sizeof(viz));
memset(d,0,sizeof(d));
}
return 0;
}