Cod sursa(job #611382)

Utilizator popoiu.georgeGeorge Popoiu popoiu.george Data 1 septembrie 2011 12:33:43
Problema Ghiozdan Scor 42
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.02 kb
#include<stdio.h>
#define inf "ghiozdan.in"
#define outf "ghiozdan.out"
#define NMax 20001
#define GMax 75001
#define WMax 201
#define INF 0x3f3f3f3f
using namespace std;

int best[GMax]; //best[i] = nr minim de obiecte cu care se poate obtine greutatea i
int v[WMax]; //v[i] = j daca exista j obiecte cu greutatea i
int N, G;

void read()
{
    scanf("%d%d", &N, &G);
    int x;
    for(int i=1; i<=N; i++) scanf("%d", &x), v[x]++;
}

void solve()
{
    for(int i=1; i<=G; i++) best[i] = INF;
    best[0] = 1;

    for(int i=1; i<WMax; i++)
    {
        if( !v[i] ) continue;
        while( v[i] )
        {
            for(int j=G; j>=0; j--)
                if( best[j]!=INF && j+i<=G && best[j]+1 < best[j+i] ) best[j+i] = best[j] + 1;
            v[i]--;
        }
    }
    for(int i = G; i>=0; i--)
        if( best[i]!=INF )
        {
            printf("%d %d\n", i, best[i]-1);
            break;
        }
}

int main()
{
	freopen(inf,"r",stdin); freopen(outf,"w",stdout);
	read(); solve();
	return 0;
}