Pagini recente » Cod sursa (job #362251) | Cod sursa (job #1455893) | Cod sursa (job #1892986) | Cod sursa (job #2828467) | Cod sursa (job #3132967)
//Ilie Dumitru
#include<cstdio>
#include<algorithm>
const int NMAX=17;
int N, G;
int v[NMAX];
int maxLeft[1<<NMAX][NMAX+1];
int solve()
{
int mask, i, aux, j;
for(mask=0;mask<(1<<N);++mask)
for(i=0;i<=N;++i)
maxLeft[mask][i]=-1;
maxLeft[0][0]=G;
for(mask=0;mask<(1<<N)-1;++mask)
{
aux=((1<<N)-1)^mask;
do
{
i=__builtin_ctz(aux);
for(j=0;j<N;++j)
{
if(maxLeft[mask][j]!=-1)
{
if(maxLeft[mask][j]>=v[i])
{
if(maxLeft[mask][j]-v[i]>maxLeft[mask|(1<<i)][j])
maxLeft[mask|(1<<i)][j]=maxLeft[mask][j]-v[i];
}
else
{
if(G-v[i]>maxLeft[mask|(1<<i)][j+1])
maxLeft[mask|(1<<i)][j+1]=G-v[i];
}
}
}
}while(aux^=aux&-aux);
}
mask=(1<<N)-1;
for(i=0;i<=N;++i)
if(maxLeft[mask][i]!=-1)
return i+1;
return 0;
}
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;
}