单页淘宝客网站模板,团员团干部如何登录到系统,wordpress留言板源码,设计画册对于给定的n#xff0c;生成集合{1#xff0c;2……n - 1}的子集 简单枚举有三种办法
1#xff0c;增量构造法
一次选出一个元素放到集合中#xff0c;每一次递归都需要输出集合#xff0c;因为是子集
#includecstdio
int A[1000000];void print_subset(int n,…对于给定的n生成集合{12……n - 1}的子集 简单枚举有三种办法
1增量构造法
一次选出一个元素放到集合中每一次递归都需要输出集合因为是子集
#includecstdio
int A[1000000];void print_subset(int n, int cur){for(int i 0; i cur; i) printf(%d , A[i]);putchar(\n);for(int i cur ? A[cur - 1] 1 : 0; i n; i){A[cur] i;print_subset(n, cur 1);}
}int main(void)
{int n; scanf(%d, n);print_subset(n, 0);return 0;
} 2位向量法
对于每一个集合的位置都用一个bool元素代表是否在集合中因此是到n cur的时候再输出集合
#includecstdio
bool B[1000000];void print_subset(int n, int cur){if(cur n){for(int i 0; i n; i)if(B[i]) printf(%d , i);putchar(\n);}else{B[cur] false;print_subset(n, cur 1);B[cur] true;print_subset(n, cur 1);}
}int main(void)
{int n; scanf(%d, n);print_subset(n, 0);return 0;
} 3二进制法
和位向量法差不多用一个标准表示这个元素是否存在然后进行枚举不过这里用的是二进制
#includecstdiovoid print_subset(int n, int s){for(int i 0; i n; i)if(s (1 i)) printf(%d , i);putchar(\n);
}int main(void)
{int n; scanf(%d, n);for(int i 0; i (1 n); i)print_subset(n, i);return 0;
}