Cod sursa(job #2123810)

Utilizator RazorBestPricop Razvan Marius RazorBest Data 6 februarie 2018 17:32:44
Problema Ghiozdan Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.65 kb
#include <fstream>
#include <algorithm>
using namespace std;

ifstream fin("ghiozdan.in");
ofstream fout("ghiozdan.out");

struct din
{
    int g, val;
} dp[75001];

int g[20001], n, G;

void afisare()
{
    for (int i = 0; i <= G; i++)
        fout << "(" << dp[i].val << ", " << dp[i].g << ") " << ' ';
    fout << '\n';
}

int count(int i)
{
    int cnt = 0;
    while (i != 0 && dp[i].val != -1)
    {
        i -= g[dp[i].val];
        cnt++;
    }

    return cnt;
}

void back(int i)
{
    while (i != 0 && dp[i].val != -1)
    {
        fout << g[dp[i].val] << '\n';
        i -= g[dp[i].val];
    }

}

void dinamica()
{
    for (int i = 0; i <= G; i++)
    {
        dp[i].val = -1;
        dp[i].g = 0;
    }
    dp[0].val = 0;

    for (int i = 1; i <= n; i++)
    {
        for (int j = 0; j <= G; j++)
        {
            if (dp[j].val != -1 && j + g[i] <= G && dp[j].val != i)
            {
                int ng = j + g[i];
                if (ng > dp[ng].g || (ng == dp[ng].g && count(j) + 1 < count(ng)))
                {
                    dp[ng].g = ng;
                    dp[ng].val = i;
                }
            }
        }
    }
}

int main()
{
    fin >> n >> G;
    for (int i = 1; i <= n; i++)
        fin >> g[i];

    sort(g + 1 , g + n + 1);
    dinamica();

    int poz = 0, nr_min;

    for (int i = 1; i <= G; i++)
    {
        int nr = count(i);
        if (dp[i].g > dp[poz].g || dp[i].g == dp[poz].g && nr < nr_min)
        {
            poz = i;
            nr_min = nr;
        }
    }

    fout << dp[poz].g << ' ' << nr_min << '\n';
    back(poz);
}