2019牛客暑期多校训练营(第二场)F Partition problem

题目链接:https://ac.nowcoder.com/acm/contest/882/F

题意:有2*n个人,两两之间有一个相对价值,想再要分成两个队,假设是A队和B队,A队的人对B队的所有人都可以产生一个价值(同一个队伍的人相互之间不产生价值),问可以产生价值的最大值是多少

思路:dfs搜索,将所有不同的分队伍情况找出来,计算总的价值

有一个优化,在分队伍时可以把计算价值的步骤加进去,这样可以减少复杂度

AC代码:

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define LL long long
const LL mod=1e9+7;
const LL inf=0x3f3f3f3f;
const LL inff=0x3f3f3f3f3f3f3f3f;
#define ME0(x) memset(x,0,sizeof(x))
#define MEF(x) memset(x,-1,sizeof(x))
#define MEI(x) memset(x,inf,sizeof(x))
using namespace std;
int n,v[30][30],vis[30];
LL ans=-1;
void dfs(int cnt,int x,LL sum)
{
    for(int i=1;i<=2*n;i++)
    {
        if(!vis[i])
        {
            sum=sum+v[x][i];
        }
        else
        {
            sum=sum-v[x][i];
        }
    }
    if(cnt+2*n-x>n;
    for(int i=1;i<=2*n;i++)
    {
        for(int j=1;j<=2*n;j++)
        {
            cin>>v[i][j];
        }
    }
    ME0(vis);
    dfs(0,0,0);
    cout<

 

你可能感兴趣的:(dfs)