Cod sursa(job #120542)

Utilizator gabitzish1Gabriel Bitis gabitzish1 Data 5 ianuarie 2008 20:34:05
Problema Elimin Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.09 kb
#include <stdio.h>
#include <stdlib.h>

int a[500][50], m, n, l[1000],r,c, s[20], suma, max, ord[1000], viz[20];

void citire()
{
	freopen("elimin.in","r",stdin);
	freopen("elimin.out","w",stdout);
	scanf("%d%d%d%d",&n,&m,&r,&c);
	int i, j;
	for (i=1; i<=n; i++)
		for (j=1; j<=m; j++)
			if (m<=n) { scanf("%d",&a[i][j]); l[i]+=a[i][j]; suma+=a[i][j];}
			else {scanf("%d",&a[j][i]); l[j]+=a[j][i]; suma+=a[j][i];}
    int aux;
    if (m>n) {aux=n; n=m; m=aux;}
    for (i=1; i<=n; i++) ord[i]=i;
}

int cmp(const void *a, const void *b)
{
	int x=*(int *)a, y=*(int *)b;
        return l[x]-l[y];
}

void calcul()
{
	int i, sum, j;
	sum=suma;
	for (i=1; i<=c; i++)
		for (j=1; j<=n; j++) sum-=a[j][s[i]];
	for (i=1; i<=r; i++)
	{
		sum-=l[ord[i]];
		for (j=1; j<=c; j++)
			sum+=a[ord[i]][s[j]];
	}
	if (sum>max) max=sum;
}

void back(int k)
{
	if (k>c) calcul();
	else
	for (int i=1; i<=m; i++)
	{
		if (!viz[i])
		{
			s[k]=i;
			back(k+1);
		}
	}
}

int main()
{
	citire();
	qsort(ord,n+1,sizeof(int),cmp);
	back(1);
	printf("%d\n",max);
	return 0;
}