思路
搜索存值,然后去除重复的输出异或值个数即可
详细思路看代码注释
代码
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;
}

京公网安备 11010502036488号