Cod sursa(job #372445)

Utilizator ilincaSorescu Ilinca ilinca Data 10 decembrie 2009 11:15:36
Problema Zebughil Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.16 kb
#include <stdio.h>
#include <limits.h>

#define pmax (1<<17) + 5
#define inf INT_MAX - 5


int n, g, w, v [25], s [pmax];
bool ok;

void init ()
{
	int i, k=1<<n;
//	fprintf(stderr, "%d\n", k); 
	for (i=1; i <= k; ++i) 
		s [i]=inf;
}

void scan ()
{
	int i;
	ok=true;
	scanf ("%d%d", &n, &g);
	for (i=1; i <= n; ++i) 
	{
		scanf ("%d", &v [i]);
		if (v [i] > g) 
			ok=false;
	}
}

inline int min (int a, int b)
{
	if (a < b) 
		return a;
	return b;
}

void back (int k, int sum, int b)
{
	if (sum > g)
	       return;	

	if (b == n)
	{
	//	fprintf(stderr, "%d %d %d %d\n", w, k, s [w], s [k]+1); 
		s [w]=min (s [w], s [k]+1);
		return ;
	}	

	if (k & (1 << b))
	{
		back (k, sum, b+1);
	//	fprintf(stderr, "%d %d %d\n", k, b, k^(1<<b)); 
		back (k ^ (1 << b), sum + v [b+1], b+1);
	}	
	else
		back (k, sum, b+1);
}

void zeb ()
{
	int k=1<<n;
	for (w=1; w < k; ++w) 
		back (w, 0, 0); //fprintf(stderr, "%d\n", s [w]); }
}

int main ()
{
	freopen ("zebughil.in", "r", stdin);
	freopen ("zebughil.out", "w", stdout);
	for (int i=1; i <= 3; ++i) 
	{
		scan ();
		if (ok)
		{	
			init ();
			zeb ();
			printf ("%d\n", s [(1 << n)-1]); 
		}
		else
			printf ("%d\n", 0);
	}
	return 0;
}