子集生成和组合问题
所有组合
子集的数量和二进制数的总个数等价
每一个子集对应一个二进制数
#include <bits/stdc++.h>
using namespace std;
void print_subset(int n)
{
for (int i = 0; i < (1 << n); i++)
{ // 0~2的n次幂,每一个i的二进制数对应一个子集,一次打印一个子集,最后得到所有的子集
for (int j = 0; j < n; j++) //打印一个子集,即打印i的二进制数中所有的1
if (i & (1 << j)) //从i的最低位开始逐个检查每一位,如果是1,打印
cout << j << " ";
cout << endl;
}
}
int main()
{
int n;
cin >> n;
print_subset(n);
}
打印n个数中任意m个数的组合
有m个元素的子集,对应的二进制数中有k个1
- kk = kk & (kk - 1) 可以消除kk二进制数的最后一个1
#include <bits/stdc++.h>
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) //二进制数中的1有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);
}