题意:
选总共K行或者列,每个数字选之后就变成0,问最大能取多少?

思路:
1.枚举选那几行的情况通过二进制表示,标记那几行选了用01串表示,1表示选,0表示不选。
2.确定了行后,计算每一列的和,剩下的次数选列的和最大的。

#include <bits/stdc++.h>

#define pb push_back
using namespace std;
typedef long long ll;
const int maxn = 1e6 + 6;
const int N    = 505;
const int inf  = 0x3f3f3f3f;
bool cmp(int x,int y) {
    return x>y;
}
int a[N][N];
int n,m,k;
int main() {
    cin>>n>>m>>k;
    for(int i=0; i<n; i++) {
        for(int j=0; j<m; j++) {
            scanf("%d",&a[i][j]);
        }
    }
    int ans=0;
    for(int i=0; i<(1<<n); i++) {
        if(__builtin_popcount(i)>k) continue;
        int tmpans=0;
        for(int j=0; j<n; j++) {
            if((1<<j)&i) {
                for(int k=0; k<m; k++) {
                    tmpans+=a[j][k];
                }
            }
        }
        int x=k-__builtin_popcount(i);
        vector<int> v(m+1,0);
        for(int j=0; j<m; j++) {
            for(int k=0; k<n; k++) {
                if((1<<k)&i) continue;
                v[j]+=a[k][j];
            }
        }
        sort(v.begin(),v.end(),cmp);
        for(int i=0; i<min(x,(int)v.size()); i++){
            tmpans+=v[i];
        }
        ans=max(ans,tmpans);
    }
    cout<<ans<<endl;
}