Partition problem(dfs暴搜)
牛客多校第二场 F题
题意就是给你2n个人,每个人之间都有相应的仇恨值,将这2n个人平均分成俩队,使得俩队之间的仇恨值最大
不会暴搜,还是自己多整理几个吧
#include <bits/stdc++.h>
using namespace std;
#define ll long long
ll a[30][30];
int n;
ll sum1 = 0,sum2 = 0;
int s1[30],s2[30];
ll ans = 0 ;
void dfs(int x,ll sum)
{
if(sum1 == n && sum2 == n)
{
ans = max(ans,sum);
return ;
}
if(sum1 < n)
{
s1[++sum1] = x;
ll k = 0;
for(int i=1;i<=sum2;i++)
{
k += a[x][s2[i]];
}
dfs(x+1,sum+k);
sum1--;
}
if(sum2 < n)
{
s2[++sum2] = x;
ll k = 0;
for(int i=1;i<=sum1;i++)
{
k += a[s1[i]][x];
}
dfs(x+1,sum+k);
sum2--;
}
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=2*n;i++)
{
for(int j=1;j<=2*n;j++)
{
scanf("%lld",&a[i][j]);
}
}
dfs(1,0);
cout<<ans<<endl;
return 0;
}
vivo公司福利 368人发布