https://ac.nowcoder.com/acm/contest/882/F
题意:给2*N个人,分成红和白两组,每个人和另外一组的每个人有一个竞争值,求最大的竞争值。给了一个邻接矩阵来表示i和j两个人之间的竞争值。
思路:首先假设所有人都放在红组,然后使用DFS枚举每一个人将其放到白组中,递归基为当白组中的人数达到n时就判断该种情况是不是最小值。
代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int MAX = 30;
int n;
ll maxx = -1;
ll value[MAX][MAX],d[MAX] = {0};
vector<int> v;
void dfs(int cur,ll sum ) {
ll temp;
int len = v.size();
if(len == n) {
maxx = max(maxx,sum);
return ;
}
if(cur > 2*n)
return ;
temp = d[cur];
for(int i = 0; i < len; i++)
temp -= 2*value[cur][v[i]];
v.push_back(cur);
dfs(cur+1,sum + temp);
v.pop_back();
dfs(cur+1,sum);
}
int main() {
ios::sync_with_stdio(false);
cin>>n;
for(int i = 1; i <= 2*n; i++)
for(int j = 1; j <= 2*n; j++)
cin>>value[i][j],d[i] += value[i][j];
dfs(1,0);
cout<<maxx<<"\n";
return 0;
}
/*
3
0 0 0 2 0 0
0 0 0 0 3 0
0 0 0 0 0 4
2 0 0 0 0 0
0 3 0 0 0 0
0 0 4 0 0 0
*/