打印n个元素的集合的子集
#include <iostream>
using namespace std;
void print_subset(int n)
{
for(int i = 0; i<(1<<n); i++)
{ //i:0~2^n,每个i的二进制数对应一个子集,一次打印一个子集
for(int j=0; j<n; j++) //打印一个子集,i的二进制数中所有的i
if(i & (1<<j)) //从i的最低位开始逐个检查每一位,如果是1,就打印
cout<<j<<" ";
cout<<endl;
}
}
int main()
{
int n;
cin>>n;
print_subset(n);
return 0;
}
打印n个数中任意m个数的组合
#include <iostream>
using namespace std;
void print_set(int n, int k)
{
for(int i = 0; i<(1<<n); i++)
{
int num = 0,kk = i; //num统计i中1的个数;kk用来处理i
while(kk){
kk = kk & (kk-1); //清除kk中的最后一个1
num++; //统计1的个数
}
if(num == k)
{
for(int j=0; j<n; j++)
if(i & (1<<j))
cout<<j<<" ";
cout<<endl;
}
}
}
int main()
{
int n, k; //n:元素的总数量; k:个数为k的子集
cin>>n>>k;
print_set(n,k);
return 0;
}