数据结构实验1
1.现有一个有n个元素的序列a=[a1,a2,⋯,an],定义这个序列的价值为。空序列的价值为0.先给你一个长度为n的序列a,求a中所有子集价值的异或和,要求子集中元素的相对位置保持不变。
异或和: 位运算的一种。如果a、b两个值不相同,则异或结果为1;如果a、b两个值相同,异或结果为0。
输入输出格式
输入
第一行一个整数
n
接下来一行有n个非负整数表示
a1,a2,⋯ ,an
输出
一个整数表示所有子集的异或和
样例1
输入
2
1 2
输出
6
数据规模
1≤n≤20
1≤a≤10^5
提示
样例1中共有四个子集
[],[1],[2],[1,2],
他们的价值分别为0,1,2,5,其异或和
0⨁1⨁2⨁5=6
解释一下异或和:
首先第一个子集价值是0,0和其它3个子集价值异或后得1,加起来就是3,然后1和其它2个子集异或后结果也是1,加起来得2,最后2和5异或得1,故异或和0⨁1⨁2⨁5=6
#include<iostream> //n<=20
using namespace std;
int b[100];//定义一个数组,用来存储子集价值
int value=0;
bool list[20];
template<class T>
int Subset(T *array,int m,int n)//n代表元素个数
{
int j=0,sum=0;
if(m>=0&&m<n)//m相当于一个标签
{//将布尔型数组list中元素值初始化为0,1,此时0,1机会均等
list[m]=1;
Subset(array,m+1,n);
list[m]=0;
Subset(array,m+1,n);
}
if(m==n)
{
for(int i=0;i<n;i++)
{
if(list[i])//当list[i]=1时
{
b[j]=array[i];//将值存到数组b中
j++;
}
}
for(int k=0;k<j;k++)
sum+=b[k]*(k+1); //子集价值
value^=sum; //求异或和
}
return value;
}
int main()
{
int n;
int a[20];
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
}
cout<<Subset(a,0,n)<<endl;
return 0;
}