Cod sursa(job #393654)

Utilizator Alexa_ioana_14Antoche Ioana Alexandra Alexa_ioana_14 Data 9 februarie 2010 19:38:19
Problema Zebughil Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.99 kb
#include<cstdio>

#define maxx(a,b) ((a<b)?b:a)
#define N_MAX 20
#define OO 2000000001

int N, best[1<<17][N_MAX],G,g[N_MAX];

int bit(int x, int n)
{
	return ((1<<n)&x) != 0;
}

int solve()
{
	for (int i=0; i<=(1<<N)-1; ++i)
	{
		for (int j=0; j<=N; ++j)
			best[i][j]=-OO;
	}
	best[0][0]=0;
	for (int i=1;i<(1<<N);++i)
	{
		for (int j=1; j<=N; ++j)
		{
			for (int k=1;k<=N;++k)
			{
				// daca k apartine i
				if (!bit(i, k-1)) continue;
				
				if (best[i-(1<<(k-1))][j] >= g[k])
					best[i][j]=maxx(best[i][j],best[i-(1<<(k-1))][j]-g[k]);
				if (best[i-(1<<(k-1))][j-1]>=0)
					best[i][j]=maxx(best[i][j],G-g[k]);
			}
			
		}
	}
	for (int i=1;i<=N; ++i)
		if(best[(1<<N)-1][i]>=0)
			return i;
	return -1;
}

int main()
{
	freopen("zebughil.in","r",stdin);
	freopen("zebughil.out","w",stdout);
	for (int i=1; i<=3; ++i)
	{
		scanf("%d%d",&N,&G);
		for (int j=1; j<=N; ++j)
			scanf("%d",&g[j]);
		printf("%d\n",solve());
	}
	return 0;
	
}