Cod sursa(job #3265604)

Utilizator Sasha_12454Eric Paturan Sasha_12454 Data 1 ianuarie 2025 15:11:56
Problema Zebughil Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.52 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f ("zebughil.in");
ofstream g ("zebughil.out");

const int NMAX = 17, INF = 1e9;

int v[NMAX];

int dp[1 << NMAX];
int rem[1 << NMAX];

int main()
{

    //ios_base :: sync_with_stdio(false);
    //cin.tie(NULL);

    int tt = 3;
    while(tt --)
    {
        int n, G;
        f >> n >> G;
        for(int i = 0; i < n; i ++)
        {
            f >> v[i];
        }
        dp[0] = rem[0] = 0;
        for(int mask = 1; mask < (1 << n); mask ++) dp[mask] = rem[mask] = INF;

        for(int mask = 0; mask < (1 << n); mask ++)
        {
            for(int i = 0; i < n; i ++)
            {
                if((mask & (1 << i)) == 0)
                {
                    int aux = dp[mask] + (rem[mask] + v[i] > G);
                    if(aux < dp[mask + (1 << i)])
                    {
                        dp[mask + (1 << i)] = aux;
                        if(rem[mask] + v[i] > G) rem[mask + (1 << i)] = rem[mask] + v[i] - G;
                        else rem[mask + (1 << i)] = rem[mask] + v[i];
                    }
                    else if(aux == dp[mask + (1 << i)])
                    {
                        aux = rem[mask] + v[i];
                        if(aux > G) aux -= G;
                        rem[mask + (1 << i)] = min(rem[mask + (1 << i)], aux);
                    }
                }
            }
        }
        g << (dp[(1 << n) - 1] + (rem[(1 << n) - 1] ? 1 : 0)) << '\n';
    }

    return 0;
}