题目的难点在于,当牛妹消除某一行时,会影响每一列和的大小。我们不妨先选定要消除的行,再改变这些行影响的列,最后对列进行贪心,而不是同时关注行和列的变化。
我们枚举出消除行的每一种情况,并计算在这些情况下我们是否可以继续加上一些列、要加上哪些列(排序)。

#include<iostream>
#include<algorithm>
#include<bits/stdc++.h>
using namespace std;

int a[20][20];
int col[20];
int n,m,k;
int cnt=0;//当前选了几行
bool cmp(int x,int y)
{
    return x>y;
}
int calc(int x)
{
    int sum=0;
    for(int i=0;i<n;i++)
    {
        if(x>>i&1==1) 
        {
            for(int j=0;j<m;j++) sum+=a[i][j];
            cnt++;
        }
        else{
            for(int j=0;j<m;j++) col[j]+=a[i][j];
        }   
    }
    return sum;
}
int main()
{
    
    scanf("%d%d%d",&n,&m,&k);
    int tempsum=0;
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<m;j++)
        {
            scanf("%d",&a[i][j]);
            tempsum+=a[i][j];
        }
    }
    if(m<=k||n<=k) 
    {
        cout<<tempsum;
        return 0;
    }
    int res=0;
    for(int i=0;i<(1<<n);i++)
    {
        memset(col,0,sizeof(col));
        cnt=0;
        int sum=calc(i);
        int cntcol=k-cnt;
        if(cnt>k||cntcol>m) continue;
        else
        {
            
            sort(col,col+m,cmp);
            for(int i=0;i<cntcol;i++) sum+=col[i];
        }
        res=max(sum,res);
    }
    
 
    printf("%d",res);
}