Cod sursa(job #2245341)

Utilizator vladisimovlad coneschi vladisimo Data 25 septembrie 2018 09:29:19
Problema Elimin Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.5 kb
#include <algorithm>
#include <cstdio>
#include <fstream>

int a[2 + 20][2 + 8200], sol = 1e9;

bool selected[2 + 20];

void calc(int n, int m, int c) {
  int sums[2 + m];
  for (int j = 1; j <= m; j++) {
    sums[j] = 0;
    for (int i = 1; i <= n; i++)
      if (!selected[i])
        sums[j] += a[i][j];
  }
  std::sort(sums + 1, sums + m + 1);
  int sum = 0;
  for (int i = 1; i <= c; i++)
    sum += sums[i];
  for (int i = 1; i <= n; i++) {
    if (selected[i])
      for (int j = 1; j <= m; j++)
        sum += a[i][j];
  }
  sol = std::min(sol, sum);
}

void backt(int n, int m, int r, int c, int k, int p) {
  if (k > n) {
    if (p == r)
      calc(n, m, c);
  } else
    for (int i = 0; i <= 1; i++) {
      selected[k] = i;
      if (i == 1 && p < r)
        backt(n, m, r, c, k + 1, p + 1);
      else if (i == 0 && p <= r)
        backt(n, m, r, c, k + 1, p);
      selected[k] = 0;
    }
}

int main() {
  freopen("elimin.in", "r", stdin);
  freopen("elimin.out", "w", stdout);
  int n, m, r, c;
  scanf("%d%d%d%d", &n, &m, &r, &c);
  bool swapping = false;
  int sumAll = 0;
  if (m < n)
    swapping = true;
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= m; j++)
    if (swapping) {
      scanf("%d", &a[j][i]);
      sumAll += a[j][i];
    } else {
      scanf("%d", &a[i][j]);
      sumAll += a[i][j];
    }
  if (swapping) {
    std::swap(n, m);
    std::swap(r, c);
  }
  backt(n, m, r, c, 1, 0);
  printf("%d", sumAll - sol);
  return 0;
}