Cod sursa(job #2121627)

Utilizator Stefan_RaduStefan Radu Stefan_Radu Data 3 februarie 2018 22:32:35
Problema Zebughil Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.26 kb
#include <fstream>
#include <vector>

using namespace std;
  
ifstream cin ("zebughil.in");
ofstream cout ("zebughil.out");

const int INF = 1e9;

void Init (int cur, int n, int cur_mask, int cur_sum, int g, 
    vector < int > &weight, vector < int > &dp) {
  
  if (cur > n) {
    dp[cur_mask] = 1;
    return;
  }

  if (1ll * cur_sum + weight[cur] <= 1ll * g) {
    Init (cur + 1, n, (cur_mask ^ (1 << (cur - 1))), cur_sum + weight[cur], g, weight, dp);
  }

  Init (cur + 1, n, cur_mask, cur_sum, g, weight, dp);
}

void Solve (int cur_mask, vector < int > &dp) {
  
  int aux = cur_mask, comp = -1;
  while (true) {

    aux = ((aux - 1) & cur_mask);
    comp = (cur_mask ^ aux);
  
    if (comp > aux) {
      break;
    }

    if (dp[aux] == INF) {
      Solve (aux, dp);
    }

    if (dp[comp] == INF) {
      Solve (comp, dp);
    }
 
    dp[cur_mask] = min (dp[cur_mask], dp[aux] + dp[comp]);
  }
}

int main () {

  int n, g, t = 3;

  vector < int > weight (18);
  vector < int > dp ((1 << 17) + 1);

  while (t --) {
  
    fill (dp.begin (), dp.end (), INF);

    cin >> n >> g;
    for (int i = 1; i <= n; ++ i) {
      cin >> weight[i];
    }

    Init (1, n, 0, 0, g, weight, dp);
    
    dp[0] = 0;
    Solve ((1 << n) - 1, dp);
    cout << dp[(1 << n) - 1] << '\n';
  }
}