Cod sursa(job #1265024)

Utilizator akaprosAna Kapros akapros Data 16 noiembrie 2014 16:49:42
Problema Elimin Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.5 kb
#include<cstdio>
#include<algorithm>
using namespace std;
int n,m,i,j,p,q,nr,l,c,S,sol;
int a[7299],sl[7299],sc[7299];
int w[7299],v[105];
void cminl()
{
    int i,j,s[7299],Sol=S;
    for (j=1;j<=m;j++)
    {
        s[j]=sc[j];
        for (i=1;i<=l;i++)
        {
            s[j]-=a[(v[i]-1)*m+j];
            if (j==1) Sol-=sl[v[i]];
        }
    }
    sort(s+1,s+m+1);
    for (i=1;i<=c;i++)
    Sol-=s[i];
    if (sol<Sol) sol=Sol;
}
void cminc()
{
    int i,j,s[7299],Sol=S;
    for (j=1;j<=n;j++)
    {
        s[j]=sl[j];
        for (i=1;i<=c;i++)
        {
            s[j]-=a[(v[j]-1)*m+i];
            if (j==1) Sol-=sc[v[i]];
        }
    }
    sort(s+1,s+n+1);
    for (i=1;i<=l;i++)
    Sol-=s[i];
    if (sol<Sol) sol=Sol;
}
void back(int nm,int lc,int k)
{
    int i;
    if (k==lc+1)
    {
        if (nm == n) cminl();
        else cminc();
    }
    else
    {
        for (i=v[k-1]+1;i<=nm;i++)
        if (!w[i])
        {
            v[k]=i;
            w[i]=1;
            back(nm,lc,k+1);
            v[k]=0;
            w[i]=0;
        }
    }
}
int main()
{
    freopen("elimin.in","r",stdin);
    freopen("elimin.out","w",stdout);
    scanf("%d %d %d %d",&n,&m,&l,&c);
    for (i=1;i<=n;i++)
    for (j=1;j<=m;j++)
    {
        scanf("%d",&a[++a[0]]);
        sl[i]=sl[i]+a[a[0]];
        sc[j]=sc[j]+a[a[0]];
        S=S+a[a[0]];
    }
    if (n<=m) back(n,l,1);
    else back(m,c,1);
    printf("%d",sol);
    return 0;
}