温存温存1

一、实验目的
1、 熟悉开发工具的使用。
2、 掌握递归的实现思想。
二、 实验内容
1、题目描述:
现有一个有n个元素的序列a=[a1,a2,⋯,an],定义这个序列的价值为 。空序列的价值为0。先给你一个长度为n的序列a,求a中所有子集价值的异或和,要求子集中元素的相对位置保持不变。
异或和: 位运算的一种。如果a、b两个值不相同,则异或结果为1;如果a、b两个值相同,异或结果为0。
输入输出格式:
输入:第一行,一个整数n
接下来一行有n个非负整数:a1,a2,⋯,an
输出:一个整数,表示所有子集价值的异或和。
2、题目描述:
现有一个有n个元素的序列a=[a1,a2,⋯,an],定义其价值为
给出这样一个序列,求其所有排列的价值vi或
其中∣为位运算或操作,⊕为位运算异或操作。
输入输出格式:
输入:输入的第一行是一个整数n (2<=n<=10),表示需排列的数的个数。
接下来一行是n个整数,数的范围是0到100000,每两个相邻数据间用一个空格分隔。
输出:
一个整数,代表所有排列价值的或。

#include<iostream>
using namespace std;
int value=0;
int Subset(int *a,int *b,int m,int n){
    
    //a为原始数组,b为确定子集中包含元素的数组 
	int sum=0,j=0;//由j确定子集中元素的相对位置 
	if(m==n){
    
    //终止条件 
		for (int i=0; i<n; i++){
    
    
			if(b[i]==1){
    
    
				sum+=a[i]*(j+1);
				j++;
			}else{
    
    
				sum+=0*(i+1);
			}
		}
		value=value^sum;
		return value;
	}else{
    
    //子集中元素的遍历 
		b[m]=0;
		Subset(a,b,m+1,n);
		b[m]=1;//重置 
		Subset(a,b,m+1,n);
	}
	
}
int main(){
    
    
	int n,a[20];
	cin>>n;
	int b[n];
	for(int i=0;i<n;i++){
    
    
		cin>>a[i];
	}
	cout<<Subset(a,b,0,n);
	return 0;
}
#include <iostream>
using namespace std;
int value=0;
void swap(int &a,int &b){
    
    //交换值 
	int t;
	t=a;
	a=b;
	b=t;
}
int P(int list[],int m,int n){
    
    
	int i,sum=0;
	if(m==n){
    
    //递归结束条件 
		for(i=0;i<n;i++){
    
    
			sum+=list[i]^(i+1);
		}
		value|=sum;
	}else{
    
    
		for(i=m;i<n;i++){
    
    
			swap(list[i],list[m]);
			P(list,m+1,n);
			swap(list[i],list[m]);
		}
	}
	return value;
}
int main(int argc, char** argv) {
    
    
	int n,a[20];
	cin>>n;
	for(int i=0;i<n;i++){
    
    
		cin>>a[i];
	}
	cout<<P(a,0,n);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/m0_51406030/article/details/121166093
1
(1)
>&1