Cod sursa(job #18527)

Utilizator butyGeorge Butnaru buty Data 18 februarie 2007 12:32:47
Problema Ghiozdan Scor 12
Compilator cpp Status done
Runda preONI 2007, Runda 2, Clasele 11-12 Marime 1.54 kb
#include<stdio.h>
const int Gmax=75001,Nmax=20001;
int V[Gmax];
int M[Gmax],P[Gmax],A[Nmax],W[Gmax],GG;
int N,G,S;
void cit()
{
	int i;
	freopen("ghiozdan.in","r",stdin);
	scanf("%d%d",&N,&G);
	for(i=1;i<=N;i++)
	{
		scanf("%d",&A[i]);
		S+=A[i];
	}
	if(S<G)
		G=S;
}
void rez()
{
	int i,j,k,ok;
	int C[Gmax],D[Gmax],E[Gmax],nc,ne,nd;
	V[0]=1;
	C[++nc]=0;
    E[++ne]=0;
	for(i=1;i<=N;i++)
	{
		for(j=1;j<=ne;j++)
			C[j]=E[j];
        nc=ne;
        nd=0;
        for(j=1;j<=nc;j++)
			if( C[j]+A[i]<=G && ( V[C[j]+A[i]]==0
            || ( V[C[j]+A[i]] && M[C[j]+A[i]]>M[C[j]]+1) ) )
			{
				V[C[j]+A[i]]=1;
				P[C[j]+A[i]]=M[C[j]]+1;
                W[C[j]+A[i]]=C[j];
				D[++nd]=C[j]+A[i];
			}
		
		ne=0;
		j=1;
		k=1;
		ok=1;
		while( j<=nc && k<=nd &&ok)
		{
			ok=0;
			if(C[j]<D[k])
			{
				ok=1;
				E[++ne]=C[j++];
				GG=E[ne];
			}
			else if(C[j]>=D[k])
			{
				ok=1;
                M[D[k]]=P[D[k]];
                E[++ne]=D[k++];
   				GG=E[ne];
			}
		}
        while(j<=nc)
        {
        	E[++ne]=C[j++];
            GG=E[ne];
        }
        while(k<=nd)
        {
            M[D[k]]=P[D[k]];
            E[++ne]=D[k++];
            GG=E[ne];
        }
	}
}
void rec(int x,int i)
{
    if(x>0||i<=M[GG])
    {
        printf("%d\n",x-W[x]);
        rec(W[x],i+1);
    }
}
void scr()
{
    freopen("ghiozdan.out","w",stdout);
    printf("%d %d\n",GG,M[GG]);
    rec(GG,1);
    fclose(stdout);
}
int main()
{
	cit();
	rez();
	scr();
	return 0;
}