Pagini recente » Cod sursa (job #1166326) | Cod sursa (job #2036290) | Cod sursa (job #2888117) | Cod sursa (job #1517313) | Cod sursa (job #169299)
Cod sursa(job #169299)
#include <stdio.h>
#include <stdlib.h>
int n, m, r, c, a[20][600], lin[600], col[600], suma, s[20], viz[20], min, coloana[600];
int cmp(const void *a, const void *b)
{
int x = *(int*)a, y = *(int*)b;
return coloana[x] - coloana[y];
}
void citire()
{
freopen("elimin.in","r",stdin);
freopen("elimin.out","w",stdout);
int i, j;
scanf("%d %d %d %d",&n,&m,&r,&c);
if (n > m) { n ^= m ^= n ^= m; r ^= c ^= r ^= c;}
for (i = 1; i <= n; i++)
for (j = 1; j <= m; j++)
{
scanf("%d",&a[i][j]);
lin[i] += a[i][j];
col[j] += a[i][j];
suma += a[i][j];
}
}
int make_sum()
{
int i, j, x = suma, ord[600];
for (i = 1; i <= m; i++) coloana[i] = col[i];
for (i = 1; i <= r; i++)
{
for (j = 1; j <= m; j++)
coloana[j] -= a[ s[i] ][j], ord[j] = j;
x -= lin[ s[i] ];
}
qsort(ord, m + 1, sizeof(int), cmp);
for (i = 1; i <= c; i++) x -= coloana[ord[i]];
return x;
}
void back(int k)
{
int i;
if (k > r) { i = make_sum(); if (i > min) min = i;}
else
for (i = s[k - 1] + 1; i <= n; i++)
if (!viz[i])
{
viz[i] = 1;
s[k] = i;
back(k + 1);
viz[i] = 0;
}
}
int main()
{
citire();
back(1);
printf("%d\n",min);
return 0;
}