Cod sursa(job #18985)

Utilizator sims_glAlexandru Simion sims_gl Data 18 februarie 2007 16:19:56
Problema Ghiozdan Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.11 kb
#include <stdio.h>
#include <algorithm>

using namespace std;

#define nm 20100
#define sm 76000
#define vm 256

int n, s, a[nm], c[sm], last[sm], x[vm];

int main()
{
	int i, j, crt, tmp, ok;

	freopen("ghiozdan.in", "r", stdin);
    freopen("ghiozdan.out", "w", stdout);

    scanf("%d%d", &n, &s);

    for (i = 1; i <= n; ++i)
    {
    	scanf("%d", &a[i]);
    	++x[a[i]];
    }
    
    sort(a + 1, a + n + 1);

    for (i = n; i > 0; --i)
    {
		for (j = s; j > 0; --j)
        	if (c[j] && (!c[j + a[i]] || c[j] + 1 < c[j + a[i]]))
            {
            	c[j + a[i]] = c[j] + 1;
                last[j + a[i]] = i;
            }

        if (!c[a[i]])
        {
        	c[a[i]] = 1;
            last[a[i]] = i;
        }
    }
    
    for (i = s; i >= 0 && !c[i]; --i);

    printf("%d %d\n", i, c[i]);

    tmp = c[i];
	crt = i;

    for (i = n; i > 0; --i)
    	if ((c[crt - a[i]] || crt == a[i]) && x[a[i]] && c[crt - a[i]] < tmp)
        {
        	printf("%d\n", a[i]);
        	--x[a[i]];
            --tmp;
            crt -= a[i];
        }

	return 0;
}