Cod sursa(job #94361)

Utilizator fireatmyselfBogdan-Alexandru Stoica fireatmyself Data 22 octombrie 2007 19:55:27
Problema Ghiozdan Scor 42
Compilator c Status done
Runda Arhiva de probleme Marime 1.93 kb
#include <stdio.h>

#define GMAX 75050
#define VMAX 222
#define INF 666000666

int G, N, A[2][GMAX], X[GMAX], F[VMAX], Gmax, Nmax;

void read()
{
        int i, j;

        freopen("ghiozdan.in", "r", stdin);
        scanf("%d%d", &N, &G);
        for (i = 0; i < N; i++) scanf("%d", &j), F[j]++;
}

void solve()
{
        int i, g, s = 0, d = 1, fmax = 0;

        for (i = 0; i < VMAX; i++)
            if (F[i]) fmax = i;

        for (g = 0; g < GMAX; g++)
            for (i = 0; i < 2; i++) A[i][g] = INF;

        for (i = 0; i < VMAX; i++)
            if (F[i])
            {
                A[s][0] = 0;
                for (g = i; g <= G && F[i]; g += i)
                    A[s][g] = A[s][g-i]+1, F[i]--;
                for (g = G; g > 0; g--)
                    if (A[s][g]<INF) break;
                if (Gmax<g) Gmax = g, Nmax = A[s][g];
                break;
            }

        for (i++; i <= fmax; i++)
        {
                if (F[i]) A[d][0] = 0;
                for (g = 0; g <= G; g++) A[d][g] = A[s][g];
                for (g = i; g <= G; g++)
                {
                    if (F[i])
                       if (A[d][g]>(A[s][g-i]+1)) A[d][g] = A[s][g-i]+1, X[g] = 1;
                    if (X[g-i]+1<=F[i])
                       if (A[d][g]>(A[d][g-i]+1)) A[d][g] = A[d][g-i]+1, X[g] = X[g-i]+1;
                }
                for (g = G; g > 0; g--)
                    if (A[d][g]<INF) break;

                if (Gmax<g) Gmax = g, Nmax = A[d][g];
                else
                if (Gmax==g&&Nmax>A[d][g]) Nmax = A[d][g];
                    
                s = (s+1)&1; d = (d+1)&1;
                for (g = 0; g <= G; g++) A[d][g] = INF, X[g] = 0;
        }
}

void write()
{
        freopen("ghiozdan.out", "w", stdout);
        printf("%d %d\n", Gmax, Nmax);
}

int main()
{
        read();
        solve();
        write();
        return 0;
}