思路和其他答主一模一样,我发这篇题解的目的就是提醒各位,要注意k的范围!!!!!!!!!!!!!!!!!
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int n,m,k;
bool cmp(int a,int b){
return a > b;
}
long long int solve(vector<vector<int>> a,int key,vector<int> x,vector<int> y){
int v = 0,cnt = 0; vector<int> log(n);
for(int i = 1;i <= (1<<(a.size()-1)) ; i = ( i<< 1)){
if((i & key) != 0) log[v] = 1,cnt++;
v++;
}
if(cnt > k || cnt < 0) return -2;
int col = k - cnt;
if (col > m) col = m;
long long int sum = 0;
for(int i = 0; i< x.size() ;i++){
for(int j = 0;j < log.size();j++) if(log[j] == 1) x[i] = x[i] - a[j][i];
}
sort(x.begin(),x.end(),cmp);
for(int i = 0;i < y.size();i++) if(log[i] == 1) sum += y[i];
for(int i = 0;i < col ;i++) sum += x[i];
return sum;
}
int main(){
cin>>n>>m>>k;
vector<vector<int>> a(n,vector<int>(m)); vector<int> x(m); vector<int> y(n);
long long int sum = 0;
for(int i = 0;i < a.size();i++){
for(int j = 0;j< a[i].size();j++) {
cin>>a[i][j];
sum = sum + a[i][j];
y[i] = y[i] + a[i][j];//计算每一行的和
x[j] = x[j] + a[i][j];//计算每一列的和
}
}
long long int maxx = -1;
for(int i = 0; i <= (1 << a.size()) - 1;i++) maxx = max(maxx,solve(a,i,x,y));
printf("%lld\n", maxx);
return 0;
}

京公网安备 11010502036488号