Pagini recente » Cod sursa (job #604765) | Cod sursa (job #3200073) | Cod sursa (job #389459) | Cod sursa (job #789088) | Cod sursa (job #18505)
Cod sursa(job #18505)
# 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;
}