Pagini recente » Cod sursa (job #2267005) | Cod sursa (job #13649) | Cod sursa (job #3038837) | Cod sursa (job #1247657) | Cod sursa (job #120721)
Cod sursa(job #120721)
#include <stdio.h>
#include <stdlib.h>
int a[500][50], m, n, l[1000],r,c, s[20], suma, max, ord[1000], viz[50], lin[1000];
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]); lin[i]+=a[i][j]; suma+=a[i][j];}
else {scanf("%d",&a[j][i]); lin[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;
for (i = 1; i <= n; i++) l[i] = lin[i];
sum=suma;
for (i=1; i<=c; i++)
for (j=1; j<=n; j++) { sum-=a[j][s[i]]; l[j] -= a[j][s[i]];}
qsort(ord,n + 1, sizeof(int), cmp);
for (i=1; i<=r; i++)
{
sum -= l[ord[i]];
}
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();
back(1);
printf("%d\n",max);
return 0;
}