Pagini recente » Cod sursa (job #378890) | Cod sursa (job #150320)
Cod sursa(job #150320)
#include<stdio.h>
#include<algorithm>
using namespace std;
int n, m, r, c, i, j, s, sm, ds[505], d[505], a[505][505], sol[25], raspuns, rs[5050], ss;
void back1(int k){
if (k == m + 1){
//prelucreaza();
int nrs = 0, sm = 0, sp;
for (int i = 1; i <= m; i ++)
if (sol[i]){
nrs ++;
sm += ds[i];
}
sp = ss - sm;
if (nrs == c){
for (int i = 1; i <= n; i ++){
rs[i] = d[i];
for (int j = 1; j <= m; j ++)
if (sol[j])
rs[i] -= a[j][i];
}
sort(rs+1, rs+n+1);
for (int i = 1; i <= r; i ++)
sp -= d[i];
if (sp > raspuns)
raspuns = sp;
}
return ;
}
sol[k] = -1;
while (sol[k] < 1){
sol[k] ++;
back1(k+1);
}
}
void back2(int k){
if (k == n + 1){
//prelucreaza();
int nrs = 0, sm = 0, sp = 0;
for (int i = 1; i <= n; i ++)
if (sol[i]){
nrs ++;
sm += d[i];
}
sp = ss - sm;
if (nrs == r){
for (int i = 1; i <= m; i ++){
rs[i] = ds[i];
for (int j = 1; j <= n; j ++)
if (sol[j])
rs[i] -= a[j][i];
}
sort(rs+1, rs+n+1);
for (int i = 1; i <= c; i ++)
sp -= rs[i];
if (sp > raspuns)
raspuns = sp;
}
return ;
}
sol[k] = -1;
while (sol[k] < 1){
sol[k] ++;
back2(k+1);
}
}
int main()
{
freopen("elimin.in", "rt", stdin);
freopen("elimin.out", "wt", stdout);
scanf("%d%d%d%d", &n, &m, &r, &c);
for (i = 1; i <= n; i ++){
s = 0;
for (j = 1; j <= m; j ++){
scanf("%d", &a[i][j]);
s += a[i][j];
ss += a[i][j];
}
d[i] = s;
}
for (j = 1; j <= m; j ++){
s = 0;
for (i = 1; i <= n; i ++)
s += a[i][j];
ds[j] = s;
}
if (m < n)
back1(1);
else
back2(1);
printf("%d\n", raspuns);
return 0;
}