Pagini recente » Cod sursa (job #771329) | Cod sursa (job #2251253) | Cod sursa (job #1521732) | Cod sursa (job #2582687) | Cod sursa (job #2235965)
#include <cstdio>
#include <algorithm>
#define max(a, b) (a>b?a:b)
#define min(a, b) (a<b?a:b)
using namespace std;
int M, N, Table[1001][1001], R, C, i, j, Total, List[1001], Smax;
void Find(int Sum){
int j;
for(j=1; j<=N; j++)List[j]=Table[0][j];
sort(List+1, List+N+1);
for(j=1; j<=C; j++)Sum-=List[j];
if(Sum>Smax)Smax=Sum;
return;
}
void BKT(int i, int last, int S){
if(i==R){Find(S); return;}
int j, k;
for(j=last+1; j<=M; j++){
for(k=1; k<=N; k++)Table[0][k]-=Table[j][k];
BKT(i+1, j, S-Table[j][0]);
for(k=1; k<=N; k++)Table[0][k]+=Table[j][k];
}
return;
}
int main()
{
freopen("elimin.in", "r", stdin);
freopen("elimin.out", "w", stdout);
scanf("%d%d%d%d", &M, &N, &R, &C);
if(M<=N)
for(i=1; i<=M; i++)
for(j=1; j<=N; j++){
scanf("%d", &Table[i][j]);
Table[i][0]+=Table[i][j];
Table[0][j]+=Table[i][j];
Total+=Table[i][j];
}
else{
for(i=1; i<=M; i++)
for(j=1; j<=N; j++) {
scanf("%d", &Table[j][i]);
Table[j][0]+=Table[j][i];
Table[0][i]+=Table[j][i];
Total+=Table[j][i];
}
swap(M, N);
swap(R, C);
}
BKT(0, 0, Total);
printf("%d", Smax);
return 0;
}