Cod sursa(job #45946)

Utilizator peanutzAndrei Homorodean peanutz Data 2 aprilie 2007 09:45:04
Problema Zebughil Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.16 kb
#include <stdio.h>

#define NMAX 18
#define INFI 30000

#define MC 1 << 18

unsigned best[MC];
unsigned extra[MC];
long n, g;
long z[NMAX];

void read()
{
	int i;
	scanf("%ld %ld\n", &n, &g);
	for(i = 0; i < n; ++i)
	{
		scanf("%ld ", &z[i]);
	}
}

int dinamic()
{
	unsigned next, nb, ne;
	unsigned i, j;

	for(i = 0; i < (1 << n); best[i] = INFI, ++i);
	for(i = 0; i < n; ++i)
	{
		best[1 << i] = 0;
		extra[1 << i] = z[i];
	}

	for(i = 1; i < (1 << n); ++i)
	{
		for(j = 0; j < n; ++j)
		{
			if(!(i & (1 << j)))
			{
				next = i | (1 << j);

				if(extra[i] + z[j] > g)
				{
					nb = best[i]+1;
					ne = z[j];
				}
				else
				{
					nb = best[i];
					ne = extra[i] + z[j];
				}

				if((nb < best[next]) || ((nb == best[next])  &&  (ne < extra[next])))
				{
					best[next] = nb;
					extra[next] = ne;
				}
			}
		}
	}
	return best[(1 << n) - 1] + (extra[(1 <<n) - 1] > 0);
}


int main()
{
	freopen("zebughil.in", "r", stdin);
	freopen("zebughil.out", "w", stdout);

	for(int i = 0; i < 3; ++i)
	{
		read();
		printf("%u\n", dinamic());
	}

	fclose(stdin);
	fclose(stdout);

	return 0;
}