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