Cod sursa(job #605665)

Utilizator dushmiMihai-Alexandru Dusmanu dushmi Data 1 august 2011 16:29:33
Problema Zebughil Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.97 kb
#include <cstdio>

const int N = 18;

int n, max_g, g[N], d[(1 << N)][N];

void read() {
  scanf("%d%d", &n, &max_g);

  for (int i = 1; i <= n; ++ i)
    scanf("%d", &g[i]);
}

void reset(int a[(1 << N)][N]) {
  for (int i = 0; i < (1 << n); ++ i)
    for (int j = 0; j <= n; ++ j)
      a[i][j] = - 1;
}

int max(int x, int y) {
  return x > y ? x : y;
}

void solve() {
  reset(d);

  d[0][0] = 0;

  for (int j = 0; j <= n; ++ j)  
    for (int i = 0; i < (1 << n); ++ i) {
      if (d[i][j] >= 0) {
        d[i][j + 1] = max_g;

        for (int k = 0; k < n; ++ k)
          if ((!(i & (1 << k))) && g[k + 1] <= d[i][j])
            d[i + (1 << k)][j] = max(d[i + (1 << k)][j], d[i][j] - g[k + 1]);
      }

    if (d[(1 << n) - 1][j] >= 0) {
      printf("%d\n", j);
      return;
    }
  }
}

int main() {
  freopen("zebughil.in", "r", stdin);
  freopen("zebughil.out", "w", stdout);

  for (int i = 1; i <= 3; ++ i) {
    reset(d);
    
    read();

    solve();
  }

  return 0;
}