Cod sursa(job #3371784)

Utilizator Andrei1209Andrei Mircea Andrei1209 Data 31 octombrie 2026 17:53:27
Problema Zebughil Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.75 kb
#include <fstream>

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

const int Nmax = 17;
int v[Nmax], dp[1 << Nmax][Nmax + 1];
int main()
{
    int t = 3;
    while (t-- )
    {
        int n, g;
        fin >> n >> g;
        int i, j;
        for ( i = 0; i < n; ++i )
            fin >> v[i];

        for( int mask = 0; mask < (1 << n); ++mask )
            for ( int ture = 0; ture <= n; ++ture )
                dp[mask][ture] = -1;

        dp[0][0] = 0;
        for ( int mask = 0; mask < (1 << n); ++mask )
        {
            for ( int ture = 0; ture < n; ++ture )
            {
                if ( dp[mask][ture] == -1 )
                    continue;

                for ( i = 0; i < n; ++i )
                {
                    if ( mask & (1 << i) )
                        continue;

                    int new_mask = mask | (1 << i);
                    if ( v[i] <= dp[mask][ture] )
                        dp[new_mask][ture] = max(dp[new_mask][ture], dp[mask][ture] - v[i] );
                    else
                        dp[new_mask][ture + 1] = max(dp[new_mask][ture + 1], g - v[i]);
                }
            }
        }

       /* for ( int mask = 0; mask < (1 << n); ++mask, fout << endl )
            for ( int ture = 0; ture <= n; ++ture)
                fout << dp[mask][ture] << " ";*/

        int mask = (1 << n) - 1;
        int sol = -1;
        for ( int ture = 1; ture <= n; ++ture )
        {
           // fout << dp[mask][ture] << " ";
            if ( dp[mask][ture] != -1 )
            {
                sol = ture;
                break;
            }
        }
       // fout << endl;
        fout << sol << endl;;
    }

    return 0;
}