(⊙o⊙),今天和爸妈一起买电视机去了,很interesting,早上看的东西应该还没忘掉 (^-^)V
枚举集合:
一般都用的二进制思想,& | ^ 就分别对应的是 交,并,对称差。枚举每一个子集,就是一个简单的循环变量 i ,而 i 怎么提取每一个元素,就是 s & (1<<i) ,循环遍历。
1 /* 2 集合的枚举 3 */ 4 5 #include6 7 using namespace std; 8 9 int cnt = 0;10 11 void print_subset(int n,int s) // s 为 枚举的集合,n 为 总集合个数12 {13 for(int i=0;i
枚举排列:
这个还是挺有代表性的,单纯的枚举排列完全可以用库函数,其思想还是有很大的作用的,就是一个解答树的概念,从当前的一个状态转到下一个状态的一个递归写法。
1 /* 2 1~n 的排列枚举 3 */ 4 5 #include6 7 using namespace std; 8 9 void print_permutation(int n,int *A,int cur) {10 if(cur==n) {11 for(int i=0;i
当然有重复的元素,就要看之前用了多少,就类似于一个标记。
1 #include2 3 using namespace std; 4 5 void print_permutation(int n,int* P,int* A,int cur) { //n 为 p 的长度 6 if(cur==n) { 7 for(int i=0;i
然后系统库函数。
1 #include2 3 using namespace std; 4 5 int main() 6 { 7 8 int A[5] = { 5,4,3,2,1}; 9 10 sort(A,A+5);11 12 do {13 for(int i=0;i<5;i++)14 printf("%d ",A[i]);15 puts("");16 }while(next_permutation(A,A+5));17 18 return 0;19 }