Cod sursa(job #400932)

Utilizator silvia_the_bestSilvia Pripoae silvia_the_best Data 22 februarie 2010 10:35:39
Problema Zebughil Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.41 kb
#include <cstdio>

#define FIN "zebughil.in"
#define FOUT "zebughil.out"

#define MAXN 18
#define MAXST (1 << 17)
#define INF 2000000001

int N, V[MAXN], G, R;
unsigned int D[MAXST][MAXN];

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

void solve()
{
    int i, j, k, ST;

    ST = (1 << N) - 1;

    for (i = 0; i <= ST; ++ i)
        for (j = 0; j <= N; ++ j)
            D[i][j] = INF;

    D[0][0] = G;

    for (i = 0; i <= ST; ++ i)
        for (j = 0; j <= N; ++ j)
            if (D[i][j] != INF)
            {
                for (k = 0; k < N; ++ k)
                    if (!((1 << k) & i))
                    {
                        if (D[i][j] + V[k + 1] > G)
                            D[i | (1 << k)][j + 1] = min(D[i | (1 << k)][j + 1], D[i][j] + V[k + 1] - G);
                        else
                            D[i | (1 << k)][j] = min(D[i | (1 << k)][j], D[i][j] + V[k + 1]);
                    }
            }

    for (i = 0; i <= N; ++ i)
    {
        //printf("***%d\n", D[ST][i]);

        if (D[ST][i] != INF)
            break;
    }

    R = i;
}

int main()
{
    int i, j;

    freopen(FIN, "r", stdin);
    freopen(FOUT, "w", stdout);

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

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

        solve();

        printf("%d\n", R);
    }
}