思路和其他答主一模一样,我发这篇题解的目的就是提醒各位,要注意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; }