Cod sursa(job #1396611)

Utilizator Ionut228Ionut Calofir Ionut228 Data 22 martie 2015 19:14:09
Problema Zebughil Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.21 kb
#include <fstream>
#include <cstring>
#include <algorithm>

using namespace std;

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

int N, G;
int B[20], dp[(1 << 18) + 5][20];

void solve()
{
    dp[0][1] = G;

    for (int mask = 1; mask <= (1 << N) - 1; ++mask)
    {
        for (int j = 1; j <= N; ++j)
        {
            for (int k = 1; k <= N; ++k)
            {
                if (dp[mask - (1 << (k - 1))][j] != -1 && (mask & (1 << (k - 1))))
                {
                    if (dp[mask - (1 << (k - 1))][j] >= B[k])
                        dp[mask][j] = max(dp[mask][j], dp[mask - (1 << (k - 1))][j] - B[k]);
                    else
                        dp[mask][j + 1] = max(dp[mask][j + 1], G - B[k]);
                }
            }
        }
    }

    for (int i = 1; i <= N + 1; ++i)
        if (dp[(1 << N) - 1][i] != -1)
        {
            fout << i << '\n';
            break;
        }
}

int main()
{
    for (int t = 1; t <= 3; ++t)
    {
        fin >> N >> G;
        for (int i = 1; i <= N; ++i)
            fin >> B[i];


        memset(dp, -1, sizeof(dp));
        solve();
    }

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