零食b2c網(wǎng)站濟(jì)南網(wǎng)絡(luò)優(yōu)化哪家專業(yè)
這道題是??蜕系囊坏李},它呢和我們之前的排座位游戲非常之相似,但是,排座位問題選擇行和列是不會(huì)改變?cè)氐闹档?#xff0c;這道題呢每每選一行都會(huì)把這行或者這列清零,所以我們的策略就是先用二進(jìn)制把選擇所有行的情況全部枚舉出來,接著再選擇列,找出和最大的情況即可
怎么用二進(jìn)制列舉情況,比如一共有3行,我們的選擇是 000 001 010 011 100 110 111,也就是說到1000結(jié)束,也就是把1左移動(dòng)3就行了
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = 20;
int a[N][N];
int n, m, k;
int col[N];
int calc(int x)
{int cnt = 0;while (x){x = x & (x-1);cnt++;}return cnt;}
bool cmp1(int x1, int x2)
{return x1 > x2;
}
int main()
{cin >> n >> m >> k;for (int i = 0; i < n; i++){for (int j = 0; j < m; j++){cin >> a[i][j];}}int ret = 0;for (int i = 0; i < (1<<n); i++){int c = calc(i);if(c > k) continue;int sum = 0;int tmp = i;memset(col, 0, sizeof(col));for (int i = 0; i < n; i++){for (int j = 0; j < m; j++){if ((tmp >> i) & 1) sum += a[i][j];elsecol[j] += a[i][j];}}sort(col, col + m, cmp1);int tmp2 = calc(tmp);for (int i = 0; i < k-tmp2; i++){sum += col[i];}ret = max(ret, sum);}cout << ret << endl;return 0;
}