Cod sursa(job #199725)

Utilizator andrei-alphaAndrei-Bogdan Antonescu andrei-alpha Data 20 iulie 2008 12:18:02
Problema Ghiozdan Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.9 kb
#include <cstdio>
#define IN "ghiozdan.in"
#define OUT "ghiozdan.out"
#define score 100
#define FOR(i,a,b)  for(int i=a;i<=b;++i)
#define FOr(i,a,b) for(int i=a;i>=b;--i)
#define G_MAX 1<<8

int max,N,G;
int V[G_MAX],C[1<<17],NR[1<<17];

void scan()
{
	int x;
	freopen(IN, "r",stdin);
	freopen(OUT, "w",stdout);
	scanf("%d%d\n", &N,&G);
	FOR(i,1,N) 
		scanf("%d\n", &x),
		++V[x],
		max = (max<x ? x : max);
}

void solve()
{
	int x,y;
	NR[0] = 1;
	
	FOr(i,max,1)
	{
		if(!V[i])
			continue;
		FOr(j,G-i,0)
		{
			if(!NR[j])
				continue;
			FOR(k,1,V[i])
				if( j+k*i <= G && !NR[j+k*i])
					NR[j+k*i] = NR[j+(k-1)*i] + 1,
					C[j+k*i] = j+(k-1)*i;
				else
					break;
		}
	}
	
	while(!NR[G])
		--G;
	printf("%d %d\n",G,--NR[G]);
	
	x=G;y = C[G];
		
	FOR(i,1,NR[G])
		printf("%d\n",x-y),
		x=y,
		y=C[x];
}

int main()
{
	scan();
	solve();
	return 0;
}