子集 C++题解

这篇文章介绍了一个编程题目,要求在C++中处理一个无重复元素的集合,生成并输出所有非空子集,保证子集内元素非递减。给出了输入格式和样例,以及使用位操作和排序策略的解决方案。
摘要由CSDN通过智能技术生成

子集

内存限制: 128 MiB 时间限制: 1000 ms 标准输入输出 题目类型: 传统 评测方式: 文本比较

题目描述

现有一个含有 n 个元素的集合(集合中没有重复的数字),请你输出这个集合的所有非空子集,并且每个子集里面的元素保证是非递减序列。

输入格式

输入有两行。

第一行为 1 个整数 n,表示初始集合元素的个数。

第二行有 n 个整数,表示集合中从左往右每个元素的值,每两个数之间有空格隔开

输出格式

输出这个集合的所有子集,每个子集占一行,子集中的每个元素之间用空格隔开,输出集合的顺序见样例

样例

样例输入:

3
3 1 2

样例输出:

1 
2 
1 2 
3 
1 3 
2 3 
1 2 3

数据范围与提示

n <= 20,0 <= a [ i ] <= 10 ^ 9

#include <bits/stdc++.h>
using namespace std;
int n, a[25];
void f(int x) {
	int cnt = 1;
	while(x != 0) {
		if(x & 1) {
			printf("%d ", a[cnt]); 
		} 
		cnt++; 
		x >>= 1; 
	} 
	printf("\n"); 
} 
int main() {
	scanf("%d", &n);
	for(int i = 1; i <= n; i++) {
		scanf("%d", &a[i]); 
	} 
	sort(a + 1, a + n + 1);
	for(int i = 1; i < (1 << n); i++) {
		f(i); 
	} 
	return 0;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值