4.2.5 求解幂集问题

1.问题描述

对于给定的正整数n(n≥1),求1~n构成的集合的所有子集(幂集)

2.解法1

采用直接穷举法求解,将1~n的存放在数组a中,求解问题变为构造集合a的所有子集。设集合a[0…2]={1,2,3},其所有子集对应的二进制位及其十进制数如下

在这里插入图片描述

#include <bits/stdc++.h>
using namespace std;

void inc(int b[], int n) {
	for(int k = 0; k < n; k++) {
		if(b[k])
			b[k] = 0;
		else {
			b[k] = 1;
			break;
		}
	}
}

void PSet(int a[], int b[], int n) {
	int pw = (int)pow(2,n);
	cout << "1~" << n << "的幂集为:" << endl;  // 执行2^n次 
	for(int i = 0; i < pw; i++) {
		cout << "{";
		for(int k = 0; k < n; k++)
			if(b[k])
				cout << a[k];
		cout << "}";
		inc(b, n); 
	}
	cout << endl;
}

int main() {
	int a[] = {1, 2, 3};
	int b[] = {0, 0, 0};
	int n = 3;
	PSet(a, b, n);
	return 0;
}
3. 解法2:采用增量穷举法求解1~n的幂集,当n=3时的求解过程

在这里插入图片描述

#include <bits/stdc++.h>
using namespace std;

vector<vector<int> > ps; // 集合的集合

void Pset(int n) {
	vector<vector<int> > ps1; // 辅助的集合的集合
	vector<vector<int> >::iterator it;
	vector<int> s;
	ps.push_back(s); // 添加空集到集合元素中
	for(int i = 1; i <= n; i++) {
		ps1 = ps;
		for(it = ps1.begin(); it != ps1.end(); it++)
			(*it).push_back(i); // ps1这个集合中的每个元素的末尾加i
		for(it = ps1.begin(); it != ps1.end(); it++) // 将ps1的每个集合的元素添加到集合ps中
			ps.push_back(*it);

	}
}

void dispps() {
	vector<vector<int> >::iterator it;
	vector<int>::iterator sit;
	for(it = ps.begin(); it != ps.end(); it++) {
		cout << "{";
		for(sit = (*it).begin(); sit != (*it).end(); sit++)
			cout << *sit;
		cout << "}";
	}
	cout << endl;
}

int main() {
	int n = 3;
	Pset(n);
	cout << "1~" << n << "的幂集为:";
	dispps();
	return 0;
}
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值