读《算法竞赛入门经典》 7.3子集生成
2013-03-07 23:53
148 查看
7.31 增量构造法
void print_subset1(int n,int *A,int cur) //增量构造法 { for(int i = 0;i < cur;i++) printf("%d ",A[i]); printf("\n"); //确定当前元素最小可能值 int s = cur ? A[cur-1]+1 : 0; //当第一次调用,cur为0,s赋值0 for(i = s;i < n;i++) { A[cur] = i; //加入一个数 print_subset1(n,A,cur+1); } }
增量构造法,顾名思义,每次添加一个元素,然后输出.
7.32 位向量法
void print_subset2(int n,int *B,int cur) { if(cur == n) //当B[0]到B[n-1]全部赋值完毕,输出 { for(int i = 0;i < n;i++) if(B[i]) printf("%d ",i); //B[i]为1或0 printf("\n"); return; } else { B[cur] = 0; //加入第cur个元素 print_subset2(n,B,cur+1); B[cur] = 1; //不加入第cur个元素 print_subset2(n,B,cur+1); } }
B[i]表征i是否加入集合,当数组B[n-1]全部赋值完毕,输出集合.
7.33二进制法
同7.32,不过使用二进制来表示子集,类似于离散数学的真值表.void print_subset3(int n,int s) { for(int i = 0;i < n;i++) if(s&(1<<i)) printf("%d ",i); printf("\n"); } int main() { int n; scanf("%d",&n); for(int i = 0;i < (1<<n);i++) print_subset(n,i); return 0; }
相关文章推荐
- 《算法竞赛入门经典》-【第七章:暴力求解法】-7.3:子集生成
- 《算法竞赛入门经典》-7.3-子集生成
- 算法竞赛入门经典读书笔记(四)7.3子集生成
- 算法竞赛入门经典:第七章 暴力求解法 7.8子集生成
- 7.3 子集生成
- 算法竞赛入门经典读书笔记(四)7.3子集生成
- 7.3子集生成
- 【算法竞赛入门经典】7.3子集生成【增量构造法】【位向量法】【二进制法】
- 暴力求解法--生成子集
- 生成1~~n的排列 && 子集
- 洛谷Oj-P1062 数列-子集生成
- C++_子集生成算法汇总
- NOIP模拟赛1 飞盘队(貌似又是USACO上面的题) MR_HE改编 子集生成+中途相遇+dp
- 暴力求解法_子集生成(增量构造法,位向量法,二进制法)
- 子集生成
- [Day 1] 7.3.3 子集生成-二进制法
- 生成一个集合的所有子集 Subset
- 关于算法竞赛入门经典一书的思考学习——枚举排序和子集生成!
- 算法分析与设计-减治法3:生成子集的减治算法及二进制法
- 编程珠玑---读书笔记---生成随机整数的有序子集