题意:
选总共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;
}

京公网安备 11010502036488号