Cod sursa(job #3334094)

Utilizator Victor5539Tanase Victor Victor5539 Data 16 ianuarie 2026 10:34:08
Problema Zebughil Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.85 kb
#include <bits/stdc++.h>
#pragma GCC optimize("Ofast,unroll-loops,fast-math,O3")
#pragma GCC target("avx,avx2,fma")

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


const int NMAX=17,MASKMAX=(1<<NMAX);
int n,i,v[NMAX+5],maskmax,mask,is_bit,cnt_bits,dp[MASKMAX+5],g[NMAX+5];
long long G;
void read()
{
    fin>>n>>G;
    for (i=0; i<n; i++)
        fin>>v[i];

}

void init()
{
    maskmax=(1<<n);

    for (mask=0; mask<maskmax; mask++)
        dp[mask]=1000;

    dp[0]=0;
}

void bkt(int step ,int newmask, int sum)
{
    for (int i=0; i<=1; i++)
    {
        if (i==0)
        {
            if (step<cnt_bits)
                bkt(step+1,newmask,sum);
            else
                dp[mask]=min(dp[mask],1+dp[mask^newmask]);
        }
        else
        {
            int actual_bit=g[step],new_newmask=newmask+(1<<actual_bit);
            long long aux1=sum+v[actual_bit];

            if (aux1<=G)
            {
                if (step<cnt_bits)
                    bkt(step+1,new_newmask,aux1);
                else
                    dp[mask]=min(dp[mask],1+dp[mask^new_newmask]);
            }
        }
    }
}

void solve()
{
    for (mask=1; mask<maskmax; mask++)
    {
        cnt_bits=0;
        for (i=0; i<n; i++)
        {
            is_bit=(1<<i);
            if (is_bit>mask)
                break;

            is_bit&=mask;

            if (is_bit)
            {
                cnt_bits++;
                g[cnt_bits]=i;
            }
        }

        bkt(1,0,0);
    }

    fout<<dp[maskmax-1]<<'\n';
}

int main()
{
    ios_base::sync_with_stdio(false);
    fin.tie(nullptr); fout.tie(nullptr);

    read();
    init();
    solve();
    read();
    init();
    solve();
    read();
    init();
    solve();
    return 0;
}