数据结构实验1.1

本文探讨了一个有趣的数据结构问题,即计算一个序列中所有子集价值的异或和,子集价值由子集中元素的相对位置决定。通过递归生成所有可能的子集并计算其价值,最终求得所有子集价值的异或和。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据结构实验1

1.现有一个有n个元素的序列a=[a1​,a2​,⋯,an​],定义这个序列的价值为emmm。空序列的价值为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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值