Pagini recente » Cod sursa (job #2076065) | Cod sursa (job #480153) | Rating Males Sebastian (Senibelan) | Cod sursa (job #2583009) | Cod sursa (job #1958994)
#include <bits/stdc++.h>
#define MAXL 15
#define MAXN 600
#define INF 0x3f3f3f3f
using namespace std;
int v[MAXL][MAXN], st[MAXL], rows, cols, n, m, columns[MAXN], rs[MAXL];
bool taken[MAXL];
int answer = INF;
int bestSum() {
int sum = 0, i, j;
for(j=1; j<=m; ++j) {
columns[j] = 0;
for(i=1; i<=n; ++i)
if(!taken[i])
columns[j] += v[i][j];
}
sort(columns+1, columns+m+1);
for(i=1; i<=cols; ++i)
sum += columns[i];
for(i=1; i<=n; ++i)
if(taken[i])
sum += rs[i];
return sum;
}
void backtracking(int level) {
if(level == rows+1) {
answer = min(answer, bestSum());
return;
}
for(int i=level; i<=n-rows+level; ++i)
if(st[level-1] < i) {
st[level] = i;
taken[i] = 1;
backtracking(level+1);
taken[i] = 0;
}
}
int main()
{
freopen("elimin.in", "r", stdin);
freopen("elimin.out", "w", stdout);
int i, j, total = 0;
scanf("%d%d%d%d", &n, &m, &rows, &cols);
if(m < n) {
swap(n, m);
swap(rows, cols);
for(j=1; j<=m; ++j)
for(i=n; i>=1; --i)
scanf("%d", &v[i][j]);
}
else {
for(i=1; i<=n; ++i)
for(j=1; j<=m; ++j)
scanf("%d", &v[i][j]);
}
for(i=1; i<=n; ++i)
for(j=1; j<=m; ++j)
rs[i] += v[i][j], total += v[i][j];
backtracking(1);
printf("%d", total - answer);
return 0;
}