Pagini recente » Cod sursa (job #2803949) | Cod sursa (job #2673757) | Cod sursa (job #740508) | Cod sursa (job #3177800) | Cod sursa (job #18772)
Cod sursa(job #18772)
#include<stdio.h>
const int Gmax=75001,Nmax=20001;
int V[Gmax];
int M[Gmax],P[Gmax],A[Nmax],W[Gmax],GG;
int C[500000],D[500000],E[500000],nc,ne,nd;
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;
V[0]=1;
nc=nd=ne=0;
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;
while( j<=nc && k<=nd )
if(C[j]<D[k])
{
E[++ne]=C[j++];
GG=E[ne];
}
else if(C[j]>D[k])
{
M[D[k]]=P[D[k]];
E[++ne]=D[k++];
GG=E[ne];
}
else if(C[j]==D[k])
{
j++;
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;
}