Pagini recente » Cod sursa (job #482465) | Cod sursa (job #1550511) | Cod sursa (job #942865) | Cod sursa (job #1292623) | Cod sursa (job #1751511)
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
int n, m;
int r, c;
int mat[90][3700];
int sumeLinie[90];
int sumeColoane[90];
int sol[90];
int solx[90];
int maxSuma = 0;
int sumaInitiala;
int tmpx[7000];
void citire()
{
scanf("%d %d %d %d", &n, &m, &r, &c);
if(n <= m)
{
for(int i = 0; i < n; i++)
{
for(int j = 0; j < m; j++)
{
scanf("%d", &mat[i][j]);
sumaInitiala += mat[i][j];
sumeLinie[i] += mat[i][j];
}
}
}
else
{
for(int i = 0; i < n; i++)
{
for(int j = 0; j < m; j++)
{
scanf("%d", &mat[j][i]);
sumaInitiala += mat[j][i];
sumeLinie[j] += mat[j][i];
}
}
swap(n, m);
swap(r, c);
}
sol[0] = -1;
}
void calculareSuma()
{
int suma = sumaInitiala;
for(int i = 1; i <= r; i++)
{
suma -= sumeLinie[sol[i]];
solx[sol[i]] = 1;
}
int tmp1;
int tmp2;
for(int i = 0; i < m; i++)
{
tmp1 = 0;
for(int j = 0; j < n; j++)
{
if(solx[j] == 0)
{
tmp1 += mat[j][i];
}
}
tmpx[tmp2] = tmp1;
tmp2++;
}
sort(tmpx, tmpx + tmp2);
for(int i = 0; i < c; i++)
{
suma -= tmpx[i];
}
if(suma > maxSuma)
{
maxSuma = suma;
}
for(int i = 1; i <= r; i++)
{
solx[sol[i]] = 0;
}
}
void backtracking(int k)
{
if(k == r + 1)
{
calculareSuma();
}
else
{
int limita = n - (r - k);
for(int i = sol[k - 1] + 1; i < limita; i++)
{
sol[k] = i;
backtracking(k + 1);
}
}
}
int main()
{
freopen("elimin.in", "r", stdin);
freopen("elimin.out", "w", stdout);
citire();
backtracking(1);
printf("%d", maxSuma);
return 0;
}