暴力枚举总结


暴力!!

训练(洛谷题单):【算法1-3】暴力枚举 - 题单 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

注意:计算时间复杂度,解题常TLE

1.循环枚举

没啥好说的,多写,善用STL,比如sort排序,unique去重

附上大佬的笔记:

2.子集枚举

套模板~

例题:P1036 [NOIP2002 普及组] 选数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

模板&题解:

 1 #include 
 2 using namespace std;
 3 int arr[1000010];
 4 bool check(int x)
 5 {
 6     for (int i = 2; i <=sqrt(x); i++)
 7         if (x % i == 0) return 0;
 8     return 1;
 9 }
10 int main()
11 {
12     int n, m;
13     scanf("%d%d", &n, &m);
14     for (int i = 0; i < n; i++) scanf("%d", &arr[i]);
15     int U = 1 << n;
16     int ans = 0;
17     for (int s = 0; s < U; s++)
18     {
19         if (__builtin_popcount(s) == m)
20         {
21             int sum = 0;
22             for (int i = 0; i < n; i++)
23                 if (s & (1 << i)) sum += arr[i];
24             if (check(sum)) ans++;
25         }
26     }
27     cout << ans << endl;
28     return 0;
29 }

3.排列枚举

 重点:STL(next_permutation)使用

 模板:

  

1 //头文件#include/#include
2  do {
3         cout<1]<<" "<2];//这里写想要输出的内容以及做选择
4     } while (next_permutation(arr + 1, arr + 1 + n));//范围内数组全排列