2 条题解
-
1
#include <iostream> using namespace std; int n, a[21]; int main() { cin >> n; for (int i = 0; i < n; i++) cin >> a[i]; for (int i = 1; i < (1 << n); i++) { for(int j=0;j<n;j++){ if(i&(1<<j)){ cout<<a[j]<<" "; } } cout << endl; } return 0; }
- 头文件和命名空间:
#include <iostream> using namespace std;
这部分引入了
iostream
头文件,以便使用输入输出流(如cin
和cout
)。using namespace std;
是为了避免在每次使用标准库中的功能时都写std::
前缀。- 全局变量:
int n, a[21];
这里定义了一个整数
n
,表示数组a
的大小。数组a
的大小固定为21,但真正使用的长度由n
决定。- 主函数:
int main() { ... return 0; }
程序的执行从这里开始。
- 输入数组大小和内容:
cin >> n; for (int i = 0; i < n; i++) cin >> a[i];
首先,程序从标准输入读取一个整数
n
,表示数组a
的大小。然后,它读取n
个整数并存储在数组a
中。- 生成并打印所有子集:
for (int i = 1; i < (1 << n); i++) { for(int j=0;j<n;j++){ if(i&(1<<j)){ cout<<a[j]<<" "; } } cout << endl; }
这是一个关键部分。
1 << n
是2的n
次方,它表示所有可能的子集数量(包括空集)。这个循环遍历所有这些可能的子集。对于每个子集,内部循环检查
i
的二进制表示中的每一位。如果第j
位是1(即i & (1<<j)
为真),则打印数组a
中的第j
个元素。例如,假设
n=3
且a={1, 2, 3}
。那么i
的值将从1到7(即二进制从001
到111
)。对于每个i
值,程序将打印a
的一个子集。输出将是:复制代码1 2 3 1 2 1 3 2 3 1 2 3
- 结束程序:
return 0;
这表示程序成功结束。
- 1
信息
- ID
- 609
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 5
- 标签
- 递交数
- 276
- 已通过
- 104
- 上传者