码迷,mamicode.com
首页 > 其他好文 > 详细

枚举法

时间:2017-01-17 23:15:29      阅读:255      评论:0      收藏:0      [点我收藏+]

标签:code   play   循环   枚举   集合   oid   ace   include   img   

(⊙o⊙),今天和爸妈一起买电视机去了,很interesting,早上看的东西应该还没忘掉 (^-^)V

 

枚举集合:

一般都用的二进制思想,& | ^ 就分别对应的是 交,并,对称差。枚举每一个子集,就是一个简单的循环变量 i ,而 i 怎么提取每一个元素,就是 s & (1<<i) ,循环遍历。

技术分享
 1 /*
 2 集合的枚举
 3 */
 4 
 5 #include <bits/stdc++.h>
 6 
 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<n;i++) {
14         if(s&(1<<i)) printf("%d ",i);
15     }
16     puts("");
17     cnt++;
18 }
19 
20 int main()
21 {
22 
23     int n = 5;
24     for(int i=0;i<(1<<n);i++) {
25         print_subset(n,i);
26     }
27 
28     printf("***%d\n",cnt);
29 
30     return 0;
31 }
View Code

 

枚举排列:

这个还是挺有代表性的,单纯的枚举排列完全可以用库函数,其思想还是有很大的作用的,就是一个解答树的概念,从当前的一个状态转到下一个状态的一个递归写法。

技术分享
 1 /*
 2 1~n 的排列枚举
 3 */
 4 
 5 #include <bits/stdc++.h>
 6 
 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<n;i++)
12             printf("%d ",A[i]);
13         puts("");
14     }
15     else {
16         for(int i=1;i<=n;i++) {
17             int ok = 1;
18             for(int j=0;j<cur;j++) {
19                 if(A[j]==i)
20                 {
21                     ok = 0;
22                     break;
23                 }
24             }
25             if(ok) {
26                 A[cur] = i;
27                 print_permutation(n,A,cur+1);
28             }
29         }
30     }
31 }
32 
33 int main()
34 {
35     int A[10];
36     print_permutation(5,A,0);
37     return 0;
38 }
View Code

 

当然有重复的元素,就要看之前用了多少,就类似于一个标记。

技术分享
 1 #include <bits/stdc++.h>
 2 
 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<n;i++) {
 8             printf("%d ",A[i]);
 9         }
10         puts("");
11     }
12     else {
13         for(int i=0;i<n;i++) {
14             int c1 = 0,c2 = 0;
15             for(int j=0;j<cur;j++)
16                 if(A[j]==P[i]) c1++;    //已经用了多少次
17             for(int j=0;j<n;j++)
18                 if(P[i]==P[j]) c2++;
19             if(c1<c2) {
20                 A[cur] = P[i];
21                 print_permutation(n,P,A,cur+1);
22             }
23         }
24     }
25 
26 }
27 
28 int main()
29 {
30     int p[5] = {1,2,3,5,5};
31     int A[10];
32     print_permutation(5,p,A,0);
33 
34     return 0;
35 }
View Code

 

然后系统库函数。

技术分享
 1 #include <bits/stdc++.h>
 2 
 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 }
View Code

 

枚举法

标签:code   play   循环   枚举   集合   oid   ace   include   img   

原文地址:http://www.cnblogs.com/TreeDream/p/6294936.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!