Pagini recente » Autentificare | vecini3 | Profil ProCoder | Cod sursa (job #705107) | Cod sursa (job #3305482)
#include <algorithm>
#include <cstdio>
#include<climits>
using namespace std;
const int NMAX = 500;
int a[NMAX][NMAX], lin_sume[NMAX], col_sume[NMAX];
int n, m, r, c,maxc=INT_MAX;
int sol[NMAX];
int linie_sterse[NMAX];
bool valid(int i)
{
if (i==0)
return true;
if (sol[i - 1] < sol[i])
return true;
return false;
}
void combinari(int position) {
if (position == r) {
int sum = 0;
for (int i = 0; i < r; i++) {
//printf("%d ", lin_sume[sol[i]]);
sum += lin_sume[sol[i]];
}
//printf("= %d\n", sum);
if (sum < maxc) {
maxc = sum;
for (int i = 0; i < r; i++) {
linie_sterse[i] = sol[i];
}
}
}
else {
for (int i = 0; i < n; i++) {
sol[position] = i;
if (valid(position)) {
combinari(position + 1);
}
}
}
}
int main() {
freopen("elimin.in", "r", stdin);
freopen("elimin.out", "w", stdout);
int i,j;
scanf("%d %d %d %d", &n, &m, &r, &c);
int suma_totala = 0;
for( i = 0; i < n; i++) {
for(j = 0; j < m; j++) {
scanf("%d", &a[i][j]);
suma_totala += a[i][j];
lin_sume[i] += a[i][j];
}
}
for( j = 0; j < m; j++) {
for( i = 0; i < n; i++) {
col_sume[j] += a[i][j];
}
}
combinari(0);
suma_totala-=maxc;
for (i = 0; i < r; i++) {
for (j = 0; j < m; j++) {
col_sume[j] -= a[linie_sterse[i]][j];
}
}
sort(col_sume, col_sume+m);
for (i=0;i<c;i++) {
suma_totala-=col_sume[i];
}
printf("%d\n",suma_totala);
return 0;
}