#include<iostream> #include<algorithm> #include<cstring> usingnamespace std; //分别为行数,竖数,回合数 int n, m, k; //存放矩形中每个值 int a[20][20]; //存放 取完行后剩下的竖数值 int list[20]; //计算行总值的函数 intcale(int st) { int sum = 0; //循环st二进制的每一位,也就是每一行的取舍情况! for (int i = 1; i <= n; i++) { //判断每一位是否为1,如果是1,就是取这行的值,并加入sum if ((((st >> (i - 1)) & 1) == 1) && k != 0) { for (int j = 1; j <= m; j++) sum += a[i][j]; k--; } //反之,将还留下的值存入list,方便后续继续求竖值 else { for (int j = 1; j <= m; j++) list[j] += a[i][j]; } } return sum; } boolcmp(int a, int b) { return a > b; } intmain() { cin >> n >> m >> k; //维护k值,是个坑点,这里卡了两发 int temp = k; int sum = 0; //维护答案 int ans = 0; for (int i = 1; i <= n; i++) for (int j = 1; j <= m; j++) { cin >> a[i][j]; sum += a[i][j]; } //先特判 if (k >= n || k >= m) ans = sum; else { //重点!!!st从0开始自增,注意要以二进制视角理解 for (int st = 0; st <= ((1 << n) - 1); st++) { k = temp; memset(list, 0, sizeof(list)); sum = cale(st); sort(list + 1, list + 1 + m, cmp); for (int i = 1; i <= k; i++) { sum += list[i]; } ans = max(ans, sum); } } cout << ans << endl; return0; }