Cod sursa(job #18505)

Utilizator lucicanuAndrei-Lucian Croitoru lucicanu Data 18 februarie 2007 12:28:20
Problema Ghiozdan Scor 50
Compilator cpp Status done
Runda preONI 2007, Runda 2, Clasele 11-12 Marime 1.14 kb
# include <stdio.h>
int n, g, a[20001], v[75001], x[75001], i, w[20001], nr, j, nr0;

void swap(int &i, int &j)
{
int t;
t=i;
i=j;
j=t;
}

int part(int l, int r)
{
int p, i, j;
p=a[r];
j=l-1;
for (i=l;i<=r;i++)
   if (a[i]>=p)
     swap(a[++j],a[i]);
return j;
}

void quickS(int l, int r)
{
int poz;
poz=part(l,r);
if (l<poz-1)
  quickS(l,poz-1);
if (r>poz+1)
  quickS(poz+1,r);
}

void afis(int i)
{
if (i==0)
  return ;
printf("%d\n",w[i]);
afis(i-w[i]);
}

int gasit(int i, int y)
{
for (int j=i;j>=1;j--)
   if (x[i]==y)
     return 1;
return 0;
}

int main()
{
freopen("ghiozdan.in","r",stdin);
freopen("ghiozdan.out","w",stdout);
scanf("%d%d",&n,&g);
for (i=1;i<=n;i++)
   scanf("%d",&a[i]);
quickS(1,n);
nr=1;
nr0=0;
x[1]=0;
for (i=1;i<=n;i++)
   {
   for (j=nr;j>=1;j--)
      if (x[j]+a[i]<=g && (v[x[j]+a[i]]==0 || v[x[j]+a[i]]>v[x[j]]+1) && !gasit(nr0,x[j]+a[i]))
	{
	v[x[j]+a[i]]=v[x[j]]+1;
	w[x[j]+a[i]]=a[i];
	nr++;
	x[nr]=x[j]+a[i];
	}
   nr0=nr;
   }
for (i=g;i>=1;i--)
   if (v[i]>0)
     {
     printf("%d %d\n",i,v[i]);
     break;
     }
afis(i);
return 0;
}