Cod sursa(job #297902)

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

using namespace std;

#define Nmax 20011
#define Lmax 200
#define Inf 0x3f3f3f3f

int v[Nmax],n,gmax,suma,g,nr,s[4*Nmax],sol[4*Nmax];

inline int max(int a, int b)
{
	return a>b?a:b;
}

inline int min(int a, int b)
{
	return a<b?a:b;
}

void read_data()
{
	int i;
	freopen("ghiozdan.in","r",stdin);
	freopen("ghiozdan.out","w",stdout);
	
	scanf("%d %d", &n,&g);
	for (i=1;i<=n;++i)
	{
		scanf("%d", &v[i]); 
	}
}

void solve()
{
	int i,j,lmax=0,ok;   
	for (i=1;i<=g;++i) 
		 s[i]=100;
    for (i=1;i<=n && s[g]==100;++i)   
    {   
       lmax+=v[i];
	   lmax=max(lmax,g);
       for (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];   
            }   
    }   
    
    ok=0;   
    i=g;   
    while(!ok)          
    {   
      if (s[i]==Inf) --i;   
      else  
      ok=1;   
    }   
    printf("%d %d\n", i-1,s[i-1]);
	g=i-1;
	while(g)
	{
		printf("%d\n", sol[g]);
		g-=sol[g];
	}
}

int main()
{
	read_data();
	solve();
	//write_data();
	return 0;
}