Cod sursa(job #2121605)

Utilizator Stefan_RaduStefan Radu Stefan_Radu Data 3 februarie 2018 22:08:46
Problema Zebughil Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 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);
}

int Solve (int cur_mask, vector < int > &dp) {
  
  if (dp[cur_mask] <= 1) {
    return 1;
  }
  
  int aux = cur_mask, comp;
  while (aux) {

    aux = ((aux - 1) & cur_mask);
    comp = (cur_mask ^ aux);

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

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

  return dp[cur_mask];
}

int main () {

  int n, g;
  
  int 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;
    
    cout << Solve ((1 << n) - 1, dp) << '\n';
  }
}