Cod sursa(job #1549096)

Utilizator mihai.constantinConstantin Mihai mihai.constantin Data 11 decembrie 2015 22:10:00
Problema Ghiozdan Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <iostream>
#include <cstdio>
using namespace std;

const int N_max = 20000;
const int G_max = 75000;
const int INF = 20001;

bool posibil[G_max+1];
int g[N_max+1];
int nr[G_max+1]; //nr[i] == NR MINIM DE OBIECTE CU CARE POT SA FORMEZ GREUTATEA i
int last[G_max+1]; //last[i] == ULTIMUL OBIECT ALES

int N,G;
int Max;

void calcul(int i)
{
    if(last[i] == -1) return;

    calcul(i - g[last[i]]);

    printf("%d\n", g[last[i]] );
}

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

    int i, j; bool GASIT;

    scanf("%d %d", &N, &G);
    for(i = 1; i <= N; i++) scanf("%d", &g[i]);

    for(i = 1; i <= G; i++)
    {
        posibil[i] = false;
        nr[i] = INF;
    }

    posibil[0] = true;
    nr[0] = 0;
    last[0] = -1;

    for(i = 1; i <= N; i++)
    {
        GASIT = true;

        for(j = G; j >= g[i]; j--)
            if(posibil[j - g[i]] == true)
            {
                posibil[j] = true;

                if(GASIT == true)
                    {last[j] = i; GASIT = false;}

                if(nr[j - g[i]] != INF && nr[j] > nr[j - g[i]] + 1)
                    nr[j] = nr[j - g[i]] + 1;

                if(Max < j) Max = j;
            }
    }


    printf("%d %d\n", Max, nr[Max]);

    //for(i = 0; i <= G; i++) printf("%d ", last[i]);
    //printf("\n");

    calcul(Max);

    return 0;
}