Nu aveti permisiuni pentru a descarca fisierul grader_test14.ok

Cod sursa(job #1410461)

Utilizator Ionut228Ionut Calofir Ionut228 Data 31 martie 2015 02:34:19
Problema Ghiozdan Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.47 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], nr[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)
        {
            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;
                        nr[j] = i;
                    }
                }
        }
    }

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

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