Pagini recente » Cod sursa (job #1106769) | Cod sursa (job #2687744) | Cod sursa (job #542550) | Cod sursa (job #488939) | Cod sursa (job #121633)
Cod sursa(job #121633)
#include <fstream.h>
#define MAXLON 1000000000
ifstream fin ("elimin.in");
ofstream fout ("elimin.out");
int a[500][500],n,m,l,c,lin[590],col[590],nrlin,nrcol,lopt[600],copt[600];
long Slmin=MAXLON,Scmin=MAXLON,Sfinal=0;
void citire()
{
fin>>n>>m>>l>>c;
for (int i=0;i<n;i++)
for (int j=0;j<m;j++)
fin>>a[i][j];
fin.close();
}
void sumal()
{
long S=0;
for (int i=0;i<n;i++)
if (lin[i]==1)
for (int j=0;j<m;j++)
S+=a[i][j];
if (S<Slmin)
{
Slmin=S;
for (int i=0;i<n;i++)
lopt[i]=lin[i];
}
}
void backl(int k)
{
if (k==n)
{
if (nrlin==l)
sumal();
return ;
}
lin[k]=0;
backl(k+1);
if (nrlin<l)
{
lin[k]=1;
nrlin++;
backl(k+1);
lin[k]=0;
nrlin--;
}
}
void sumac()
{
long S;
for (int i=0;i<m;i++)
if (col[i]==1)
for (int j=0;j<n;j++)
S+=a[j][i];
if (S<Scmin)
{
Scmin=S;
for (int k=0;k<m;k++)
copt[k]=col[k];
}
}
void backc(int k)
{
if (k==m)
{
if (nrcol==c)
sumac();
return ;
}
col[k]=0;
backc(k+1);
if (nrcol<c)
{
col[k]=1;
nrcol++;
backc(k+1);
col[k]=0;
nrcol--;
}
}
void sol()
{
for (int k=0;k<m;k++)
if (copt[k]==1)
for (int u=0;u<n;u++)
a[u][k]=0;
for (int i=0;i<n;i++)
for (int j=0;j<m;j++)
a[i][m]+=a[i][j];
short ok=1,p=n;
while (ok)
{
ok=0;
p--;
for (int i=0;i<p;i++)
{
if (a[i][m]>a[i+1][m])
{
for (int k=0;k<=m;k++)
{
int aux=a[i][k];
a[i][k]=a[i+1][k];
a[i+1][k]=aux;
}
ok=1;
}
}
}
for (int h=l;h<n;h++)
for (int j=0;j<m;j++)
Sfinal+=a[h][j];
}
void soc()
{
for (int o=0;o<n;o++)
if (lopt[o]==1)
for (int j=0;j<m;j++)
a[o][j]=0;
for (int i=0;i<m;i++)
for (int j=0;j<n;j++)
a[n][i]+=a[j][i];
short ok=1,p=m;
while (ok)
{
ok=0;
p--;
for (int i=0;i<p;i++)
if (a[n][i]>a[n][i+1])
{
ok=1;
for (int l=0;l<=n;l++)
{
int aux=a[l][i];
a[l][i]=a[l][i+1];
a[l][i+1]=aux;
}
}
}
for (int h=0;h<n;h++)
for (int d=c;d<m;d++)
Sfinal+=a[h][d];
}
int main()
{
citire();
if (c>l)
{
backc(0);
sol();
}
else
{
backl(0);
soc();
}
fout<<Sfinal<<"\n";
fout.close();
return 0;
}