Cod sursa(job #50247)

Utilizator lucibitLucian Onea lucibit Data 7 aprilie 2007 12:06:07
Problema Ghiozdan Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.16 kb
#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;}