Cod sursa(job #601882)

Utilizator crushackPopescu Silviu crushack Data 8 iulie 2011 04:33:40
Problema Zebughil Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.04 kb
#include <stdio.h>
#include <string.h>
#include <queue>
#include <utility>
#include <algorithm>
#define NMax 18
using namespace std;

const char IN[]="zebughil.in",OUT[]="zebughil.out";

int Tes=3,N,G;
int a[NMax] , T[NMax][1<<NMax];

int solve()
{
	queue<pair<int,int> > qu;
	int i,j,k,r,mask;
	memset(T,0,sizeof(T));
	
	for (i=0;i<=(1<<N);++i)
		for (j=0;j<N;++j)
			T[j][i]=-1;
	for (i=0;i<N;++i)
		mask=1<<i,
		T[0][mask]=a[i];
	for (i=0;i<N;++i)
	{
		for (j=0;j<= (1<<N);++j)
			for (k=0;k<N;++k) if ( T[i][j]!=-1 && (r=((1<<k) ^ j )) > j)
				if ( T[i][j]+a[k]<=G )
					T[i][r]  = T[i][r]==-1 || T[i][j]+a[k]<T[i][r] ? T[i][j]+a[k] : T[i][r];
				else
					T[i+1][r]= T[i+1][r]==-1 || T[i+1][r]<=a[k] ? a[k] : T[i+1][r];
		if (T[i][ (1<<N) - 1 ]!=-1 ) return i+1;
	}
	return -1;
}

int main()
{
	int i;
	freopen(IN,"r",stdin);
	freopen(OUT,"w",stdout);
	while (Tes--)
	{
		scanf("%d%d",&N,&G);
		for (i=0;i<N;++i) scanf("%d",a+i);
		printf("%d\n",solve());
	}
	fclose(stdout);
	fclose(stdin);
	return 0;
}