Pagini recente » Cod sursa (job #1604972) | Cod sursa (job #1066519) | serj | forsen | Cod sursa (job #120545)
Cod sursa(job #120545)
#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])
{
viz[i] = 1;
s[k]=i;
back(k+1);
viz[i] = 0;
}
}
}
int main()
{
citire();
qsort(ord,n+1,sizeof(int),cmp);
back(1);
printf("%d\n",max);
return 0;
}