使用二进制枚举的方式枚举横,横一旦定下来了就可以贪心的去选取列了。要注意如果题中给的k大于等于横或列直接输出全部的和。
#include <bits/stdc++.h> #define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0) using namespace std; int a[20][20]; int lie[20]; int n, m, k; int calc(int st) { int i = 0, cnt = 0; int sum = 0; while (i<n) { if (((st>>i)&1)==1) { for (int j=0;j<m;j++) { sum += a[i][j]; } cnt++; } else { for (int j=0;j<m;j++) { lie[j] += a[i][j]; } } i++; } if (cnt>k) { return 0; } sort(lie, lie+m,greater<>()); for (int j=0;j<k-cnt;j++) { sum += lie[j]; } return sum; } int main() { IOS; int sum = 0; cin>>n>>m>>k; for (int i=0;i<n;i++) { for (int j=0;j<m;j++) { cin>>a[i][j]; sum += a[i][j]; } } if (k>=m||k>=n) { cout<<sum; return 0; } int ans = 0; //以二进制枚举横 for (int st=0;st<=((1<<n)-1);st++) { memset(lie, 0, sizeof(lie)); int sum = calc(st); ans = max(ans, sum); } cout<<ans; return 0; }