Cod sursa(job #405217)

Utilizator iulia609fara nume iulia609 Data 27 februarie 2010 19:23:54
Problema Zebughil Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 kb
#include <stdio.h>
using namespace std;
#define NMAX 20
#define VAL (1 << 17)
#define INF 2000000001
//#define min(a,b) a<b ? a:b

int A[NMAX], B[VAL][NMAX], N, G, rez;


int min(int A, int B)
{
    return A < B ? A : B;
}

void init(int val)
{ int i, j;

	for (i = 0; i <= val; i++)
        for (j = 0; j <= N; j++)
            B[i][j] = INF;

    B[0][1] = 0;	
}


int main()
{ int k, i, j, t, val, nr,ok;

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

    for (k = 1; k <= 3; k++)
    {
        scanf("%d %d", &N, &G);

        for (j = 1; j <= N; j++)
            scanf("%d", &A[j]);

        val = (1<<N) -1;

		init(val);
	
		for (i = 0; i <= val; i++)
			for (j = 0; j <= N; j++)
				if (B[i][j] != INF)
					for (t = 0; t < N; t++)
					{   
						nr = 1<<t;
						ok = nr&i;
						
						if (ok == 0)
						{
							ok = i|nr;
							
							if (B[i][j] + A[t + 1] <= G) B[ok][j] = min(B[ok][j], B[i][j] + A[t+1]);
								else B[ok][j + 1] = min(B[ok][j+1], A[t+1]);
						}
					}
	
		for (i = 1; i <= N; i++)
			if (B[val][i] != INF) break;

        printf("%d\n", min(N, i));
    }
}