Cod sursa(job #18446)

Utilizator pauldbPaul-Dan Baltescu pauldb Data 18 februarie 2007 12:14:07
Problema Ghiozdan Scor 0
Compilator cpp Status done
Runda preONI 2007, Runda 2, Clasele 11-12 Marime 1.08 kb
#include <stdio.h>

#define maxn 1010
#define maxx 15010
#define stop 10000000

int n,m,sol,rez;
int a[maxn],s[maxn];
int c[maxx],d[maxx],p[maxn][maxx];

int main()
{
	freopen("ghiozdan.in","r",stdin);
	freopen("ghiozdan.out","w",stdout);

	int i,j,x,y;

	scanf("%d %d",&n,&m);
	for (i=1;i<=n;i++) scanf("%d",&a[i]);
	
	sol=0;
	for (i=1;i<=m;i++) c[i]=maxn;
	c[0]=0;
	
	for (i=1;i<=n;i++)
    {
        for (j=0;j<=m;j++) 
        {
            d[j]=c[j];
			p[i][j]=j;
        }
        
		for (j=0;j+a[i]<=m;j++)
		  if (d[j]!=maxn)
          {
               c[j+a[i]]=d[j]+1;
			   p[i][j+a[i]]=j;
			   if (j+a[i]>sol)
			   {
				   sol=j+a[i];
				   rez=d[j]+1;
			   }
               else if ((j+a[i]==sol) && (d[j]+1<rez)) rez=d[j]+1;
          }
    }	
    
    x=n;
	y=sol;
    i=0;
	while (x>0)
    {
          if (p[x][y]!=y) 
          {
               s[++i]=a[x];
               y=p[x][y];
          }
          x--;
    }
    
    printf("%d %d\n",sol,rez);
    for (i=1;i<=rez;i++) printf("%d\n",s[i]);
    
    return 0;
}