用二进制位的0和1表示集合中是否存在该元素
要生成0~n的子集,先生成0~n的二进制序列,这些序列的0、1位正好可以对应一个子集中全集在该位置上的元素是否存在,将其作为子集中存在的元素的标记,输出对应元素。
#include
#include
#include
#include
using namespace std;
void subset(int n,int s){
for(int i=0;i if(s&(1< //s&(1< } printf("n"); } int main(){ int n=4; for(int i=0;i<(1< //i<(1< subset(n,i); } #include #include using namespace std; void print_subset_zl(int n,int* A,int cur){//增量构造法 for(int i=0;i printf("n");//每次都要输出 int s=cur?A[cur-1]+1:0;//定序,确保只输出一次相同的集合 for(int i=s;i A[cur]=i; print_subset_zl(n,A,cur+1); } } void print_subset_wxl(int n,int* B,int cur){//传递数组 if(cur==n){ for(int i=0;i printf("n"); return; } B[cur]=1;//选 print_subset_wxl(n,B,cur+1); B[cur]=0;//不选 print_subset_wxl(n,B,cur+1); } void print_subset_binary(int n,int s){ for(int i=0;i if(s&(1< printf("n"); } int main(){ int k[5]; print_subset_zl(5,k,0); print_subset_wxl(5,k,0); for(int i=0;i<(1<<5);i++){ print_subset_binary(5,i); } return 0; } ©著作权归作者所有:来自51CTO博客作者Rign的原创作品,如需转载,请注明出处,否则将追究法律责任



