Cod sursa(job #297918)

Utilizator AndreiDDiaconeasa Andrei AndreiD Data 5 aprilie 2009 18:28:29
Problema Ghiozdan Scor 18
Compilator cpp Status done
Runda Arhiva de probleme Marime 1 kb
#include <cstdio>   

#define Gmax 75001
#define Nmax 20001
#define Inf 1<<17  

int n,g,v[Nmax],s[Gmax],sol[Gmax];   
  
int maxim(int a, int b)
{
	if (a>b) return a;
	return b;
}

void read_data()   
{   
	freopen("ghiozdan.in","r",stdin);   
    freopen("ghiozdan.out","w",stdout);   

    scanf("%d %d", &n, &g);   
    for (int i=1;i<=n;++i)   
        scanf("%d", &v[i]);   
    for (int i=1;i<=g;++i)   
        s[i]=Inf;   
}   
  
void solve()   
{   
    int lmax=0;   
    for (int i=1;i<=n && s[g]==Inf;++i)   
    {   
        lmax+=v[i];   
        lmax=maxim(lmax,g);   
        for (int j=lmax;j>=v[i];--j)   
            if (s[j]>s[j-v[i]]+1)   
            {   
                s[j]=s[j-v[i]]+1;   
                sol[j]=v[i];   
            }   
    }   
  
    while(s[g]==Inf) g--;
	printf("%d %d\n", g,s[g]);
	while(g)
	{
		printf("%d\n", sol[g]);
		g-=sol[g];
	}
}   
  
int main()   
{   
    read_data();   
    solve();   
    return 0;   
}