Cod sursa(job #169303)

Utilizator gabitzish1Gabriel Bitis gabitzish1 Data 1 aprilie 2008 16:19:48
Problema Elimin Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.26 kb
#include <stdio.h>
#include <stdlib.h>

long 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("%ld %ld %ld %ld",&n,&m,&r,&c);
	if (n > m) 
	{
		i = n;	n = m;	m = i;
		i = r;  r = c;  c = i;
	}

	for (i = 1; i <= n; i++)
		for (j = 1; j <= m; j++)
		{
			scanf("%dl",&a[i][j]);
			lin[i] += a[i][j];
			col[j] += a[i][j];
			suma += a[i][j];
		}
}

long make_sum()
{
	long 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("%ld\n",min);
	return 0;
}