校内题目——子集
【问题描述】
对于 n=4 时,对应的集合 s={4,3,2,1},他的非空子集有 15 个依次如下:
当 n=4 时,集合{4,3,2,1}的 15 个子集分别对应于 4 位二进制数:
{1}:0001;{2}:0010;{1,2}:0011;{3}:0100,…,{1,2,3,4}:1111。
把二进制数相对应的十进制数的 1,2,3,…,15 分别作为相应集合的编号。
如子集{1,2,4}对应的二进制数是 1011,相应的十进制数是 11,所以子集{1,2,4}的编号
为 11。
任务:
对于给定的 n 和 m,输出集合{1,2,…,n}的编号为 m 的子集。
【输入格式】
n,m
【输出格式】
集合的第 m 个子集的元素,元素从小到大输出,中间一个空格隔开。
【样例输入】
4 11
【样例输出】
1 2 4
【数据范围及约定】
100%的数据:n<=20,m<=2^n-1。
那么,这就是一道水(是真水)题
思路转化二进制后看对应位置有没有1就OK了
代码:
#include<bits/stdc++.h> using namespace std; int n,m,judge[22],k=1;//n就是站位的 int main(){ scanf("%d%d",&n,&m); while(m>0) judge[k]=m%2,m/=2,k++; for(int i=1;i<=k-1;i++) if(judge[i]!=0)printf("%d ",i); return 0; }