Cod sursa(job #215000)

Utilizator devilkindSavin Tiberiu devilkind Data 17 octombrie 2008 12:32:38
Problema Zebughil Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.89 kb
#include <stdio.h>
#include <utility>

using namespace std;

#define NMAX 20
#define SMAX 1 << 20
#define mp make_pair
#define ff first
#define ss second

int a[NMAX];
int G,N;
pair<int,int> D[SMAX];
pair<int,int> P;

void solve()
{
	scanf("%d %d", &N, &G);

	int i,j;

	for (i = 0; i < N; i++)
		scanf("%d ", &a[i]);

	D[0] = mp(0,0);

	for (i = 1; i < (1 << N); i++)
		{
			D[i] = mp(20, 0); 
			for (j = 0; j < N; j++)
				if (i & (1 << j)) 
				{
					P=D[ i - (1 << j) ];

					if (a[j] > P.ss) 
					{
						P.ff ++;
						P.ss = G-a[j];
					}
						else P.ss -= a[j];

					if (P.ff < D[i].ff) D[i] = P;
					if ( (P.ff == D[i].ff) && (P.ss > D[i].ss) ) D[i] = P;
				}

//			printf("%d -> %d %d\n", i, D[i].ff, D[i].ss);
		}
	printf("%d\n",D[ (1 << N) - 1 ].ff);
}

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

	solve();
	solve();
	solve();
	return 0;
}