2020—1—29排列组合

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;
}

发布了32 篇原创文章 · 获赞 1 · 访问量 1355

猜你喜欢

转载自blog.csdn.net/QXK_Jack/article/details/104111109