Pagini recente » Clasament hc_round10 | Cod sursa (job #2255931) | Cod sursa (job #830530) | Cod sursa (job #2227740) | Cod sursa (job #1747764)
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
int n, m;
int r, c;
int mat[100][100];
int sumeLinie[100];
int sumeColoane[100];
vector<int> sol;
int solx[100];
int maxSuma = 0;
int sumaInitiala;
void citire()
{
scanf("%d %d %d %d", &n, &m, &c, &r);
if(n <= m || true == true)
{
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);
// }
}
void calculareSuma()
{
int suma = sumaInitiala;
if(sol.size() != r)
{
return;
}
for(int i = 0; i < 100; i++)
{
solx[i] = 0;
}
for(int i = 0; i < sol.size(); i++)
{
suma -= sumeLinie[sol[i]];
solx[sol[i]] = 1;
}
int tmp1;
vector<int> tmpx;
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.push_back(tmp1);
}
sort(tmpx.begin(), tmpx.end());
for(int i = 0; i < c; i++)
{
suma -= tmpx[i];
}
if(suma > maxSuma)
{
maxSuma = suma;
}
}
void backtracking()
{
long long limita = ((long long)1 << (n));
for(long long k = 1; k < limita; k++)
{
sol.clear();
for(int i = 0; i <= 16; i++)
{
if((k & (1 << i)) != 0)
{
sol.push_back(i);
}
}
if(sol.size() != r)
{
continue;
}
calculareSuma();
}
printf("%d", maxSuma);
}
int main()
{
freopen("elimin.in", "r", stdin);
freopen("elimin.out", "w", stdout);
citire();
backtracking();
return 0;
}