Cod sursa(job #2121631)

Utilizator Stefan_RaduStefan Radu Stefan_Radu Data 3 februarie 2018 22:45:43
Problema Zebughil Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.14 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 main () {

  int n, g, t = 3;

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

  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;

    for (int mask = 1; mask < (1 << n); ++ mask) {
      if (dp[mask] != INF) {
        continue;
      }
  
      int aux = mask, comp = -1;
      while (aux > comp) {
        aux = ((aux - 1) & mask);
        comp = (aux ^ mask);

        dp[mask] = min (dp[mask], dp[aux] + dp[comp]);
      }
    }

    cout << dp[(1 << n) - 1] << '\n';
  }
}