Cod sursa(job #1939366)

Utilizator popabogdanPopa Bogdan Ioan popabogdan Data 25 martie 2017 17:55:21
Problema Ghiozdan Scor 82
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.41 kb
#include <bits/stdc++.h>

#define inf 1000000000
#define Vmax 202
#define Gmax 75002

using namespace std;

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

int Freq[Vmax];
int dp[Gmax];
int i, j, k;
int N, G;
int x;
int Nmin;

int main()
{
    fin >> N >> G;
    for(i = 1; i <= N; i++)
    {
        fin >> x;
        Freq[x]++;
    }
    for(i = 0; i <= G; i++)
        dp[i] = inf;
    dp[0] = 0;
    for(i = Vmax - 2; i >= 1; i--)
        if(Freq[i])
            for(j = G - i; j >= 0; j--)
                for(k = 1; k <= Freq[i] && j + i * k <= G; k++)
                    if(dp[j + i * k] > dp[j] + k)
                        dp[j + i * k] = dp[j] + k;

    for(i = G; i >= 1; i--)
        if(dp[i] != inf)
        {
            fout << i << " " << dp[i] << "\n";
            Nmin = dp[i];
            break;
        }
    while(i)
        for(j = Vmax - 2; j >= 1; j--)
            if(Freq[j])
            {
                bool ok = false;
                for(k = 1; k <= Freq[j] && j * k <= i; k++)
                    if(dp[i - j * k] == dp[i] - k)
                    {
                        ok = true;
                        i -= j * k;
                        while(k--)
                            fout << j << "\n";
                        break;
                    }
                if(ok)
                    break;
            }
    return 0;
}