Cod sursa(job #1555285)

Utilizator JibrilCernea Bernard Silvestru Jibril Data 22 decembrie 2015 15:40:43
Problema Ghiozdan Scor 54
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.14 kb
#include <cstdio>

using namespace std;

int main()
{
    int i, j, maxim, n, gmax, c[77777], v[20003], last[77777], ok;
    freopen("ghiozdan.in", "r", stdin);
    freopen("ghiozdan.out", "w", stdout);
    scanf("%d%d", &n, &gmax);
    for(i=0; i<n; i++) scanf("%d", v+i);
    for(i=1; i<=gmax; i++) c[i]=30000;
    //for(i=0; i<n; i++) printf("%d ", v[i]);
    c[0]=1;
    maxim=0;
    last[0]=-1;
    for(i=0; i<n; i++){
        for(j=maxim; j>=0; j--){
            ok=1;
            if(c[j]<30000 && j+v[i]<=gmax){
                    if(c[j+v[i]]>c[j]+1){
                        c[j+v[i]]=c[j]+1;
                        if(ok){
                            last[j+v[i]]=v[i];
                            ok=0;}

                    }
                    if(maxim<j+v[i]) maxim=j+v[i];

            }
        }
    }
    i=gmax;
    //for(i=0; i<=gmax; i++) printf("%d ", c[i]);
    //printf("\n");
    //for(i=0; i<=gmax; i++) printf("%d ", last[i]);
    while(c[i]==30000) i--;
    printf("%d %d\n", i, c[i]-1);

    while(last[i]>=0){
        printf("%d\n", last[i]);
        i=i-last[i];
    }

    return 0;
}