Cod sursa(job #3132969)

Utilizator Ilie_MityIlie Dumitru Ilie_Mity Data 24 mai 2023 16:23:33
Problema Zebughil Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.09 kb
//Ilie Dumitru
#include<cstdio>
#include<algorithm>
const int NMAX=19;

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;
}