Cod sursa(job #2642972)

Utilizator cyg_vladioanBirsan Vlad cyg_vladioan Data 17 august 2020 23:34:42
Problema Zebughil Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.65 kb
#include <cstdio>
#include <queue>
#include <algorithm>
#include <vector>
#define bm first
#define cst second
using namespace std;
typedef pair <int , int> ii;
const int NMAX = 17;
const int INF = 2.e9;
vector <int> z;
bool operator<(ii a , ii b)
{
    return a.cst > b.cst;
}
int v[NMAX + 5] , d[(1 << 17) + 5] , n , G;
void backt(int start , int g , int bm)
{
    if(bm)
        z.push_back(bm);
    for(int i = start ; i <= n ; i ++)
        if(g + v[i] <= G)
            backt(i + 1 , g + v[i] , bm|(1<<(i - 1)));
}
int main()
{
    freopen("zebughil.in" , "r" , stdin);
    freopen("zebughil.out" , "w" , stdout);
    int i , t , lim , bm , new_bm , cst;
    for(t = 1 ; t <= 3 ; t ++)
    {
        scanf("%d%d" , &n , &G);
        for(i = 1 ; i <= n ; i ++)
            scanf("%d" , &v[i]);
        sort(v + 1 , v + n + 1);
        backt(1 , 0 , 0);
        lim = (1 << n) - 1;
        for(i = 1 ; i <= lim ; i ++)
            d[i] = INF;
        priority_queue <ii> pq;
        pq.push({0 , 0});
        while(!pq.empty())
        {
            bm = pq.top().bm;
            cst = pq.top().cst;
            pq.pop();
            if(bm == lim)
            {
                printf("%d\n" , cst);
                break;
            }
            if(d[bm] < cst)
                continue;
            for(i = 0 ; i < z.size() ; i ++)
            {
                new_bm = (bm | z[i]);
                if(cst + 1 < d[new_bm])
                {
                    d[new_bm] = cst + 1;
                    pq.push({new_bm , cst + 1});
                }
            }
        }
        z.clear();
    }
    return 0;
}