Cod sursa(job #1369981)

Utilizator raztaapDumitru raztaap Data 3 martie 2015 12:29:44
Problema Ghiozdan Scor 36
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.25 kb
#include <cstdio>
int n, G, cw, l;
int D[2][75100], W[25100], P[25100];
void citire()
{
    int i;
    scanf("%d%d", &n, &G);
    for(i=1;i<=n;++i)
    {
        scanf("%d", &W[i]);
        P[i]=1;
    }
}
int minim(int a, int b)
{
    if(a<b) return a;
    else return b;
}
void rezolva_problema()
{
    int i;
    citire();
    l=0;
    for(i=1;i<=n;++i, l=1-l)
        for(cw=0;cw<=G;++cw)
        {
            D[1-l][cw]=D[l][cw];
            if(W[i]<=cw){
            if(W[i]<cw)
            {
                if(D[1-l][cw]&&D[l][cw-W[i]])
                    D[1-l][cw]=minim(D[1-l][cw], D[l][cw-W[i]]+P[i]);
                else
                    if(!D[1-l][cw]&&D[l][cw-W[i]])
                        D[1-l][cw]=D[l][cw-W[i]]+P[i];
            }
            else
                if(W[i]==cw&&D[1-l][cw])
                    D[1-l][cw]=minim(D[1-l][cw], P[i]);
                else
                    D[1-l][cw]=P[i];}
        }
    int pmax=0;
    for(cw=G;cw>=0;--cw)
        if(D[l][cw]&&(!pmax)){
            printf("%d %d",cw, D[l][cw]);
            pmax=1;
        }
}
int main()
{
    freopen("ghiozdan.in", "r", stdin);
    freopen("ghiozdan.out", "w", stdout);
    rezolva_problema();
    return 0;
}