https://blog.csdn.net/qq_43746332/article/details/101117176
**
#include<bits/stdc++.h>
using namespace std;
void print_set(int n,int k)
{
for(int i=0;i<(1<<n);i++)//1<<n:2^n二进制,想想元素与集合
{
int num=0,kk=i;
while(kk)
{
kk=kk&(kk-1);//操作一次,除去最右侧的1,所以num计算的是1的个数,二进制中1所对应的下标(从右向左计算),便是值
num++;
}
if(num==k)
{
for(int j=0;j<n;j++)
{
if(i&(1<<j)) //比如i=0,i的左移第一位,二位…都是0,都满足条件的,因为a&b(a,b相同则为1,反之为0),所以有0、1,0、2,0、3…组合
printf("%d ",j);
}
printf("\n");
}
}
}
int main()
{
int k,n;
cin>>n>>k;//n是元素总数量,个数为k的子集
print_set(n,k);
//printf("%d",1<<n);
return 0;
}