第13课:子集枚举

潘CSP200十点班

2023-07-17 9:24:11
2023-07-26 22:24:11

信息与公告

子集枚举代码模板

方法1:permutation

int a[100];
……  
for(int k=1; k<=n; k++)   //从n选1 到 n选n 
{
	int b[21]= {0};
	for(int i=1; i<=k; i++) b[i]=1;  // 做一个b数组,放入k个1		
	do
	{			
		for(int j=1; j<=n; j++)   // 输出每个子集 
		{
			if(b[j]==1)
				cout<<a[j]<<" ";				
		}
		cout<<endl;
	}
	while(prev_permutation(b+1,b+n+1));   // 全排列枚举b数组
}



方法2:bitset二进制枚举

int a[100];    // 注意:从下标0开始存放
……  
for (int i = 0; i < (1<<n); i++)      // 子集 i 从 0 ~ (1<<n) ,表示枚举 00...00 ~ 11...11。如果不枚举00...00,则 i = 1 开始
{                           
	bitset<30> b(i);   // 将i转换为二进制数b,即子集0…0到子集1…1 
	for (int j=0; j<n; j++)    // 找出b中所有的1,表示a中对应元素被选入子集i
	{
		if (b[j]==1)  // b[j]=1,表示 a[j] 入选子集 i
		{
			……
		}
	}
}