Pagini recente » Cod sursa (job #2260215) | Cod sursa (job #2713112) | Cod sursa (job #1850191) | Cod sursa (job #1328567) | Cod sursa (job #50247)
Cod sursa(job #50247)
#include <stdio.h>
#define maxn 20001
#define maxg 75001
long int g[maxn],c1[maxg],c2[maxg],a[maxg],G,N;
void interc(long int p,long int q)
{long int i,j,k,m;
long int a1[maxn];
m=(p+q)/2;
i=p; j=m+1;
k=0;
while (i<=m && j<=q)
if(g[i]>g[j]) a1[++k]=g[i++];
else a1[++k]=g[j++];
while (i<=m) a1[++k]=g[i++];
while (j<=q) a1[++k]=g[j++];
for(i=p,k=1;i<=q;i++,k++) g[i]=a1[k];
}
void sort(long int p, long int q)
{if(p!=q) {sort(p,(p+q)/2); sort((p+q)/2+1,q);
interc(p,q);
}
}
int main ()
{long int i,j,NR,max;
freopen("ghiozdan.in","r",stdin);
scanf("%ld %ld\n",&N,&G);
for(i=1;i<=N;i++)
{scanf("%ld\n",&g[i]);
}
sort(1,N);
for(i=1;i<=G;i++) c2[i]=c1[i]=maxn+1;
for(i=1;i<=N;i++)
{if(g[i]<=G && c1[g[i]]>1) {c2[g[i]]=1; a[g[i]]=i;}
for(j=1;j<=G;j++)
if((c1[j]!=maxn+1) && (g[i]+j<=G) ) if( (c1[j]+1<c1[j+g[i]]) && (c2[j]+1<c2[j+g[i]]) ) {c2[j+g[i]]=c1[j]+1; a[j+g[i]]=i;}
for(j=1;j<=G;j++) c1[j]=c2[j];
}
j=G;
while(c2[j]==maxn+1) j--;
max=j;
NR=c2[j];
freopen("ghiozdan.out","w",stdout);
printf("%ld %ld\n",max,NR);
for(i=1;i<=NR;i++) {printf("%ld\n",g[a[j]]);j=j-g[a[j]];}
return 0;}