Cod sursa(job #2338534)

Utilizator Andrei-27Arhire Andrei Andrei-27 Data 7 februarie 2019 16:30:09
Problema Zebughil Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.54 kb
#include <bits/stdc++.h>
#define pb push_back
using namespace std ;
ifstream in ("zebughil.in") ;
ofstream out ("zebughil.out") ;
int64_t st [ 20 ] , n , best , nrtrucks , nrstones , nrzero ;
int64_t g [ 20 ] , gmax  ;
bool viz [ 20 ] ;
vector < int > ans ;
void print ( int k )
{
    int64_t s = 0 ;
    for ( int i = 1 ; i <= k ;++ i )
    {
        s += g [ st [ i ] ] ;
    }
    if ( s == best && k < ans.size() && k )
    {
      ans.clear() ;
      for ( int i =1 ; i <= k ; ++ i )  ans.pb ( st [ i ] )  ;

    }
    if ( s <= gmax && s > best )
        {
        best = s , ans.clear() ;
        for (int i = 1 ; i <= k ; ++ i )    ans.pb( st [ i ] ) ;
        }
}
void bt ( int n , int k , int i , int64_t sum )
{
    for ( int j  = i ; j <= n ; ++ j )
    {
        if ( !viz [ j ] && sum  + g [ j ] <= gmax )
        st [ k ] = j , print( k ) , bt ( n , k + 1 , j + 1 , sum + g [ j ] ) ;
    }
}
int main ()
{
    int t = 3 ;
    while ( t -- )
    {
    nrtrucks = 0 , nrstones = 0 , best = 0 ;
    nrzero = 0 ;
    in >> n >> gmax ;
    for ( int i = 1 ; i <= n ; ++ i )
    {
        in >> g [ i ] , viz [ i ] = false ;
        if ( g [ i ] == 0 )
        nrzero ++ , viz [ i ] = true ;
    }
    while ( nrstones != n - nrzero )
        {
        bt ( n , 1 , 1 , 0 ) ;
            best = 0 ;
            nrstones += ans.size() ;
        while ( ans.size() )    viz [ ans.back() ] = true , ans.pop_back() ;
            nrtrucks ++ ;

        }
    out << nrtrucks << '\n' ;
    }

    return 0 ;
}