Cod sursa(job #657179)

Utilizator a_h1926Heidelbacher Andrei a_h1926 Data 5 ianuarie 2012 21:44:04
Problema Ghiozdan Scor 54
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.27 kb
#include <cstdio>
#include <algorithm>

#define GMax 75005
#define WMax 205

using namespace std;

int N[WMax], DP[2][GMax], MaxW, MaxG, GS, NS;

void Read ()
{
    freopen ("ghiozdan.in", "r", stdin);
    int n;
    scanf ("%d %d", &n, &MaxG);
    for (; n>0; --n)
    {
        int CurrentW;
        scanf ("%d", &CurrentW);
        ++N[CurrentW];
        MaxW=max (MaxW, CurrentW);
    }
}

void Print ()
{
    freopen ("ghiozdan.out", "w", stdout);
    printf ("%d %d\n", GS, NS);
}

void Initialize ()
{
    for (int G=1; G<=MaxG; ++G)
    {
        DP[0][G]=GMax;
    }
}

void Solve ()
{
    Initialize ();
    int L=1;
    for (int W=1; W<=MaxW; ++W, L^=1)
    {
        DP[L][0]=0;
        for (int G=1; G<=MaxG; ++G)
        {
            DP[L][G]=GMax;
            for (int K=0; K<=N[W] and K*W<=G; ++K)
            {
                DP[L][G]=min (DP[L][G], DP[L^1][G-K*W]+K);
                if (DP[L^1][G-K*W]+K<DP[L][G])
                {

                }
            }
        }
    }
    for (int G=MaxG; G>=0; --G)
    {
        if (DP[L^1][G]<GMax)
        {
            GS=G, NS=DP[L^1][G];
            return;
        }
    }
}

int main()
{
    Read ();
    Solve ();
    Print ();
    return 0;
}