Cod sursa(job #3132972)

Utilizator Ilie_MityIlie Dumitru Ilie_Mity Data 24 mai 2023 16:34:59
Problema Zebughil Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.18 kb
//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;
}