Cod sursa(job #2121616)

Utilizator Stefan_RaduStefan Radu Stefan_Radu Data 3 februarie 2018 22:19:27
Problema Zebughil Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 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) {
  
  int aux = cur_mask, comp;
  while (aux) {

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

    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, 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';
  }
}