本体针对集合元素进行编号,使用二进制位的思想,将集合中每个元素赋予一个值,0表示不使用这个值,1表示使用这个值,然后从0个到集合元素总个数进行取0值,使用全排列将所有的二进制位进行排列,然后将1位置的值进行异或,再求和得到总的值。
代码如下:
int subsetXORSum(vector<int>& nums) {
vector<int> a;
int result = 0;
for(int i = 0;i < nums.size();i++){
int m[nums.size()];
a.clear();
for(int j = 0;j < i;j++){
a.push_back(0);
}
for(int j = i;j < nums.size();j++){
a.push_back(1);
}
do{
for(int j = 0;j < nums.size();j++){
if(a[j] == 1){
m[j] = nums[j];
}
else{
m[j] = 0;
}
}
int n = 0;
for(int j = 0;j < nums.size();j++){
if(m[j] != 0){
n = n ^ m[j];
}
}
result += n;
}while(next_permutation(a.begin(),a.end()));
}
return result;
}