Cod sursa(job #169332)

Utilizator gabitzish1Gabriel Bitis gabitzish1 Data 1 aprilie 2008 17:00:15
Problema Elimin Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.24 kb
#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 + 1; 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;
}