Cod sursa(job #495431)

Utilizator DraStiKDragos Oprica DraStiK Data 25 octombrie 2010 11:22:19
Problema Ghiozdan Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.13 kb
#include <algorithm>
using namespace std;

#define MAX 75005
#define DIM 20005
#define LIM 205

int v[DIM],cnt[LIM],nr[MAX],val[MAX];
int n,g,v_max;

void read ()
{
    int i;

    scanf ("%d%d",&n,&g);
    for (i=1; i<=n; ++i)
    {
        scanf ("%d",&v[i]);
        ++cnt[v[i]];
        v_max=max (v_max,v[i]);
    }
}

void solve ()
{
    int i,j,k;

    nr[0]=1;
    for (i=v_max; i>=1; --i)
        if (cnt[i])
            for (j=g-i; j>=0; --j)
                if (nr[j])
                    for (k=1; k<=cnt[i] && j+i*k<=g; ++k)
                        if (!nr[j+i*k])
                        {
                            nr[j+i*k]=nr[j]+k;
                            val[j+i*k]=j+i*(k-1);
                        }
                        else
                            break ;
}

void print ()
{
    for ( ; !nr[g] && g; --g);
    printf ("%d %d\n",g,nr[g]-1);
    for ( ; g; g=val[g])
        printf ("%d\n",g-val[g]);
}

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

    read ();
    solve ();
    print ();

    return 0;
}