Pagini recente » Cod sursa (job #699381) | Cod sursa (job #916983) | Cod sursa (job #759754) | Cod sursa (job #964458) | Cod sursa (job #2339022)
#include <iostream>
#include <fstream>
#include <algorithm>
const int MNMAX = 3700;
int Mat[MNMAX][MNMAX];
int Sum[MNMAX];
int copySum[MNMAX];
int lastOne(int num) {
return num & -num;
}
int ones(int num) {
int countR = 0;
while (num) {
num -= lastOne(num);
++countR;
}
return countR;
}
void reinit_Sum(int N) {
for (int i = 1; i <= N; ++i) {
copySum[i] = Sum[i];
}
}
int main() {
std::ifstream in("elimin.in");
std::ofstream out("elimin.out");
int N, M, R, C;
in >> N >> M >> R >> C;
if (M > N) {
std::swap(M, N);
std::swap(R, C);
}
long long int totalSum = 0;
for (int i = 1; i <= N; ++i) {
for (int j = 1; j <= M; ++j) {
in >> Mat[i][j];
Sum[i] += Mat[i][j];
}
totalSum += Sum[i];
}
int pow2 = 1 << N;
long long int maxTotalSum = -1;
for (int x = 1; x < pow2; ++x) {
if (ones(x) == C) {
for (int c = 0; c < M; ++c) {
if ((1 << c) & x) {
reinit_Sum(N);
long long int copyTotalSum = totalSum;
for (int r = 1; r <= N; ++r) {
copySum[r] -= Mat[c + 1][r];
copyTotalSum -= Mat[c + 1][r];;
}
std::sort(copySum + 1, copySum + 1 + N);
for (int i = 1; i <= R; ++i) {
copyTotalSum -= copySum[i];
}
maxTotalSum = std::max(maxTotalSum, copyTotalSum);
}
}
}
}
out << maxTotalSum;
system("PAUSE");
return 0;
}