Cod sursa(job #807187)

Utilizator auRSTARHreapca Aurelian auRSTAR Data 4 noiembrie 2012 12:30:17
Problema Zebughil Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.67 kb
#include<cstdio>
#include<bitset>
#include<deque>
#include<vector>
using namespace std;
deque<pair<int,int> >Q;
bitset<18>B;
bitset<2320000> viz;
int N,G,V[18],a,cost,pft,conf,i,SOL,j,ok;
vector<int> T;
int main()
{
    freopen("zebughil.in","r",stdin);
    freopen("zebughil.out","w",stdout);
    for(j=1;j<=3;j++)
    {
        SOL=0;
        Q.resize(0);
        conf=cost=pft=0;
        viz=0;
        scanf("%d%d",&N,&G);
        for(i=1;i<=N;i++)scanf("%d",&V[i]);
        for(;N;)
        {
            Q.push_back(make_pair(0,0));
            viz[0]=1;
            for(;!Q.empty();)
            {
                B=Q.front().first;
                cost=Q.front().second;
                if(cost>pft){pft=cost;conf=B.to_ulong();}
                if(pft==G)break;
                for(i=1;i<=N;i++)
                {
                    if(B[i])continue;
                    B[i]=1;
                    cost+=V[i];
                    if(cost>G){B[i]=0;cost-=V[i];continue;}
                    a=B.to_ulong();
                    if(viz[a]){B[i]=0;cost-=V[i];continue;}
                    viz[a]=1;
                    Q.push_back(make_pair(a,cost));
                    B[i]=0;
                    cost-=V[i];
                }
                Q.pop_front();
            }
            B=conf;
            ++SOL;
            T.resize(0);
            for(i=1;i<=N;i++)if(!B[i])T.push_back(V[i]);
            vector<int>::iterator it=T.begin();
            for(N=1;it!=T.end();N++,it++)V[N]=*it;
            --N;
            Q.resize(0);
            viz=0;
            pft=0;conf=0;
        }
        printf("%d\n",SOL);
    }
    return 0;
}