Cod sursa(job #2211473)

Utilizator AlexandruLuchianov1Alex Luchianov AlexandruLuchianov1 Data 10 iunie 2018 14:59:12
Problema Zebughil Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.19 kb
#include <iostream>
#include <fstream>

using namespace std;

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

#define ll long long

int const nmax = 17;
ll const inf = 200000000005;
int const maxmask = (1 << nmax);

ll v[5 + nmax];

ll dpc[5 + maxmask];
ll dpl[5 + maxmask];

void solve(){
  int n ;
  ll gmax;
  in >> n >> gmax;
  for(int i = 0 ; i < n ;i++)
    in >> v[i];

  for(int mask = 0 ; mask < (1 << n) ;mask++){
    dpc[mask] = dpl[mask] = inf;
  }
  dpc[0] = 1;
  dpl[0] = 0;
  for(int mask = 0 ; mask < (1 << n) ;mask++){
    for(int j = 0 ; j < n ;j++){
      if(0 == ((1 << j) & mask) ){
        int mask2 = mask | (1 << j);

        ll newdpc = dpc[mask];
        ll newdpl = dpl[mask];
        if(newdpl + v[j] <= gmax)
          newdpl += v[j];
        else{
          newdpc++;
          newdpl = v[j];
        }

        if(newdpc < dpc[mask2] || (newdpc == dpc[mask2] && newdpl < dpl[mask2])){
          dpc[mask2] = newdpc;
          dpl[mask2] = newdpl;
        }

      }
    }
  }
  out << dpc[(1 << n) - 1] << '\n';
}

int main()
{
  for(int testcase = 1 ;testcase <= 3 ;testcase++){
    solve();
  }
  return 0;
}