Cod sursa(job #1314112)

Utilizator felixiPuscasu Felix felixi Data 11 ianuarie 2015 15:55:29
Problema Elimin Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.41 kb
#include <fstream>
#include <algorithm>
using namespace std;

ifstream fin ("elimin.in");
ofstream fout ("elimin.out");

const short M = 16, N = 523;

int m, n, a[M][N], em, en, MAX, v[M], total;

void check_sol() {
    int sol = total;
    int aux[N];
    for (int i = 1; i <= n; ++i)
        aux[i] = a[0][i];
    for (int i = 1; i <= em; ++i)
        for (int j = 1; j <= n; ++j) {
            aux[j] -= a[v[i]][j];
            sol -= a[v[i]][j];
        }
    sort (aux + 1, aux + n + 1);
    for (int i = 1; i <= en; ++i)
        sol -= aux[i];
    MAX = max(MAX, sol);
}

void back(int k) {
    int i = v[k-1] + 1;
    for (; i <= m; ++i) {
        v[k] = i;
        if (k < em)
            back(k+1);
        else
            check_sol();
    }
}

int main() {
    fin >> m >> n >> em >> en;
    if (m > 15 || m > n) {
        swap(m, n);
        swap(em, en);
        for (int i = 1; i <= n; ++i)
            for (int j = 1; j <= m; ++j) {
                fin >> a[j][i];
                a[j][0] += a[j][i];
                a[0][i] += a[j][i];
            }
    }
    else {
        for (int i = 1; i <= m; ++i)
            for (int j = 1; j <= n; ++j) {
                fin >> a[i][j];
                a[0][j] += a[i][j];
                a[i][0] += a[i][j];
            }
    }
    for (int i = 1; i <= m; ++i)
        total += a[i][0];
    back(1);
    fout << MAX;
}