Pagini recente » Cod sursa (job #2888871) | Cod sursa (job #1745592) | Cod sursa (job #1652455) | Cod sursa (job #85339) | Cod sursa (job #18527)
Cod sursa(job #18527)
#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;
}