P3067 Balanced Cow Subsets G(折半搜索

#include
using namespace std;
using VI = vector;
using ll = long long;
using PII = pair ;
const int mod = 998244353;
unordered_mapmp;
int n;
int a[30];
VI res;
void dfs1(int x ,int st ,int sum){
    if(x == n/2 + 1){
        mp[sum].push_back(st);
        return;
    }
    dfs1(x + 1 , st , sum);
    dfs1(x + 1 , st | (1<>n;
    for(int i = 1 ; i <= n ; i++) cin>>a[i];
    res.resize((1<<(n+1)) - 1);
    dfs1(1,0,0);
    dfs2(n/2 + 1 , 0 , 0);
    //cout<

抄别人的题解的一天捏

折半搜索前一半和后一半

对于分三组的处理,是通过 1 , -1 ,0 (左 , 右  , 无)

考虑前一半分组情况  左a右b 后一半分组情况 左c右d

a + c = b + d 

a - b = d - c 

于是搜索中维护两组差值就可

你可能感兴趣的:(搜索,算法,数据结构)