Cod sursa(job #1410447)

Utilizator Ionut228Ionut Calofir Ionut228 Data 31 martie 2015 02:08:32
Problema Ghiozdan Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.48 kb
#include <fstream>

using namespace std;

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

const int INF = 0x3f3f3f3f;

int N, G;
int V[205], TT[75005], ap[75005];
int dp[75005]; // dp[i] - numarul minim de obiecte avand greutatea i

int main()
{
    fin >> N >> G;
    for (int i = 1, x; i <= N; ++i)
    {
        fin >> x;
        ++V[x];
    }

    for (int i = 1; i <= 75000; ++i)
        dp[i] = INF;

    for (int gr = 200; gr >= 0; --gr)
    {
        if (!V[gr])
            continue;
        for (int i = 0; i <= 75000; ++i)
            ap[i] = 0;
        for (int j = G; j >= gr; --j)
        {
            if (dp[j] != INF)
                continue;
            for (int i = 1; ap[j] + i <= V[gr] && i * gr <= j; ++i)
                if (dp[j - i * gr] != INF)
                {
                    if (dp[j - i * gr] + i <= dp[j])
                    {
                        dp[j] = dp[j - i * gr] + i;
                        ap[j - i * gr] = i;
                        TT[j] = gr;
                    }
                }
        }
                //dp[j] = min(dp[j], dp[j - i * gr] + i);
    }

    for (int gr = G; gr >= 0; --gr)
        if (dp[gr] != INF)
        {
            fout << gr << ' ' << dp[gr] << '\n';
            while (gr)
            {
                fout << TT[gr] << '\n';
                gr -= TT[gr];
            }
            break;
        }

    fin.close();
    fout.close();
    return 0;
}