思路

搜索存值,然后去除重复的输出异或值个数即可

详细思路看代码注释

代码

vi ans;//异或值
vi a;//石头数量
int te[12];//独立的袋子
int cnt = 0;//计算独立袋子数量
void dfs(int u, int cur)//u是处理第u个袋子,cur是当前的异或值
{
    if (u == n + 1)
    {
        ans.push_back(cur);//n个全都遍历完,存值
        return;
    }
    te[cnt] = a[u];//第一种去向,这个袋子自己作为独立的袋子
    cnt++;
    dfs(u + 1, cur ^ a[u]);//接着搜下一个袋子
    cnt--;//回溯
    for (int i = 0; i < cnt; i++)//第二个去向,把这个袋子的石头放到独立的袋子里
    {
        int pre = te[i];//以前独立袋子石头的数量
        int sum = pre + a[u];//现在
        te[i] = sum;
        dfs(u + 1, cur ^ pre ^ sum);//因为之前搜索的时候异或过一次原先石头的数量,所以再异或一次消掉,异或性质:x^x=0;抵消完再异或现在石头的数量
        te[i] = pre;//回溯
    }
}
void solve()
{
    cin >> n;
    a.resize(n + 1);
    for (int i = 1; i <= n; i++)
    {
        cin >> a[i];
    }
    dfs(1, 0);
    sort(all(ans));//排序去重
    ans.erase(unique(all(ans)), ans.end());
    cout << ans.size() << endl;
}