Pagini recente » Cod sursa (job #2949037) | Cod sursa (job #1377937) | Cod sursa (job #315239) | Cod sursa (job #254370) | Cod sursa (job #3132972)
//Ilie Dumitru
#include<cstdio>
#include<algorithm>
const int NMAX=17;
int N, G;
int v[NMAX];
int maxLeft[1<<NMAX][2];
int solve()
{
int mask, i, aux, j;
maxLeft[0][0]=G;
for(mask=1;mask<(1<<N);++mask)
maxLeft[mask][0]=-1;
for(i=0;i<N;++i)
{
for(mask=0;mask<(1<<N);++mask)
maxLeft[mask][(i&1)^1]=-1;
for(mask=0;mask<(1<<N);++mask)
{
if(maxLeft[mask][i&1]!=-1)
{
aux=((1<<N)-1)^mask;
while(aux)
{
j=__builtin_ctz(aux);
aux^=1<<j;
if(maxLeft[mask][i&1]>=v[j])
{
if(maxLeft[mask|(1<<j)][i&1]<maxLeft[mask][i&1]-v[j])
maxLeft[mask|(1<<j)][i&1]=maxLeft[mask][i&1]-v[j];
}
else
{
if(maxLeft[mask|(1<<j)][(i&1)^1]<G-v[j])
maxLeft[mask|(1<<j)][(i&1)^1]=G-v[j];
}
}
}
}
if(maxLeft[mask-1][i&1]!=-1)
return i+1;
if(maxLeft[mask-1][(i&1)^1]!=-1)
return i+2;
}
return N;
}
int main()
{
FILE* f=fopen("zebughil.in", "r"), *g=fopen("zebughil.out", "w");
int _=3, i;
do
{
fscanf(f, "%d%d", &N, &G);
for(i=0;i<N;++i)
scanf("%d", v+i);
printf("%d\n", solve());
}while(--_);
fclose(f);
fclose(g);
return 0;
}