Cod sursa(job #480188)

Utilizator eudanipEugenie Daniel Posdarascu eudanip Data 26 august 2010 19:05:05
Problema Ghiozdan Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.98 kb
#include<stdio.h>

#define minim(a,b) (a<b ? a : b)
#define maxim(a,b) (a>b ? a : b)

int n,g,f[205],vmax,gmax;
int sol[80006],rec[80005];

int main ()
{
    int i,j,t,val,lim;
    freopen("ghiozdan.in","r",stdin);
    freopen("ghiozdan.out","w",stdout);
    scanf("%d%d",&n,&g);
    for(i=1;i<=n;i++)
    {
        scanf("%d",&val);
        f[val]++;
        vmax=maxim(vmax,val);
    }
    sol[0]=1;
    for(i=vmax;i>=1;i--)
    {
        if(!f[i])
            continue;
        for(j=gmax;j>=0;j--)
            if(sol[j])
            {
                lim=minim(g,j+i*f[i]);
                for(t=j+i;t<=lim && !sol[t];t+=i)
                {
                    gmax=maxim(gmax,t);
                    sol[t]=sol[t-i]+1;
                    rec[t]=i;
                }
            }
    }
    printf("%d %d\n",gmax,--sol[gmax]);
    while(gmax)
    {
        printf("%d\n",rec[gmax]);
        gmax-=rec[gmax];
    }
    return 0;
}