Cod sursa(job #18626)

Utilizator pauldbPaul-Dan Baltescu pauldb Data 18 februarie 2007 12:49:08
Problema Ghiozdan Scor 16
Compilator cpp Status done
Runda preONI 2007, Runda 2, Clasele 11-12 Marime 1.28 kb
#include <stdio.h>
#include <algorithm>

using namespace std;

#define maxn 20010
#define maxx 75010
#define maxc 210

int n,m,sol,rez,l;
int a[maxn],s[maxn],b[maxc];
int c[maxx],d[maxx];

int cmp(int x,int y)
{
    return (x>y);
}

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]);
        b[a[i]]++;
    }
    
    sort(a+1,a+n+1,cmp);
    
	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];
        
		for (j=0;j+a[i]<=m;j++)
		  if (d[j]!=maxn)
          {
               c[j+a[i]]=d[j]+1;
			   if (j+a[i]>sol)
			   {
				   sol=j+a[i];
				   rez=c[j+a[i]];
			   }
               else if ((j+a[i]==sol) && (d[j]+1<rez)) rez=d[j]+1;
          }
    }	
    
    x=n;
	y=sol;
    l=0;
	while (y>0)
    {
          for (i=1;i<=n;i++) 
			if ((b[a[i]]>0) && (y-a[i]>=0) && (c[y-a[i]]+1==c[y]))
            {
                s[++l]=a[i];
                y-=a[i];
                b[a[i]]--;
                break;
            }
    }
    
    printf("%d %d\n",sol,rez);
    for (i=1;i<=rez;i++) printf("%d\n",s[i]);
    
    return 0;
}