Cod sursa(job #1539243)

Utilizator mihai.constantinConstantin Mihai mihai.constantin Data 30 noiembrie 2015 15:41:10
Problema Ghiozdan Scor 58
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.53 kb
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;

FILE *in, *out;

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

int weight[N_max+1];
int sol[G_max+1]; // sol[i] = NR MINIM DE OBIECTE AVAND GREUTATEA i
int last[G_max+1];

int N, G, weight_max;

void calcul(int x)
{
    if(x - weight[ last[x] ] == 0) {printf("%d\n", weight[ last[x] ]); return;}

    calcul(x - weight[ last[x] ]);

    printf("%d\n", weight[ last[x] ]);
}

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

    int i, j;

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

    sort(weight+1, weight+N+1);

    last[0] = -1;

    for(i = 1; i <= N; i++)
        for(j = G - weight[i]; j >= 0; j--)
        {
            if(last[j] != 0)
            {   if(last[j + weight[i]] == 0 || sol[j + weight[i]] > sol[j] + 1)
                {
                    sol[j + weight[i]] = sol[j] + 1;
                    last[j + weight[i]] = i;

                    if(weight_max < j + weight[i])
                        weight_max = j + weight[i];
                }

                if(i == N) break;

            }
        }

    cout << weight_max << " " << sol[weight_max] <<'\n';

    /*for(int i = 1; i <= G; i++) cout << i <<" ";
    cout <<'\n';
    for(int i = 1; i <= G; i++) cout << sol[i] <<" ";
    cout << '\n';
    for(int i = 1; i <= G; i++) cout << last[i] <<" ";*/

    calcul(weight_max);

    return 0;
}