-
个人简介
网站
枚举
将所有的可能一个一个列举出来尝试每一种可能---暴力枚举
使用枚举的情况
- 最优解
- 方案数目
- 可行的方案
枚举的流程
能不能枚举 → 枚举谁 → 怎么枚举 → 早点停
- 能不能枚举(10^8)
- 枚举的范围: 最大、最小
- 用 for 例举出所有的坑(一层、两层...)
- 判断 + 提前停

for i=n to m if i%3==0 and i%5!=0 cout i多重枚举
枚举的对象不止一个
for i=1 to n-1 for j=i+1 to n if i+j == k cout yes return 0; cout no- 能不能枚举(<10^8) 10^6
- 枚举的范围: 最大、最小 :arr[0] to arr[n]
- 用 for 例举出所有的坑(一层、两层...):for i + for j
- 判断 + 提前停:可以
水仙花数
#include <iostream> using namespace std; int main(){ for(int i=100;i<=999;i++){ int g=i%10; int s=i/10%10; int b=i/100; if(g*g*g+s*s*s+b*b*b==i){ cout<<i<<" "; } } return 0; }百元百鸡
#include <bits/stdc++.h> using namespace std; int main(){ //100 块买 100 只鸡 g 5 for(int g=1;g<20;g++){ for(int m=1;m<33;m++){ int x = 100-(g+m); if(100==g*5+m*3+x/3 && x%3==0){ cout << g << ' ' << m << ' ' <<x<<endl; } } } return 0; }数字翻转
#include <bits/stdc++.h> #define DEBUG(var) cout << "[DEBUG]" << #var << " = " << var << endl using namespace std; int main() { int n1, n2; scanf("%d %d", &n1, &n2); int t1 = 0, t2 = 0; while (n1 != 0) { t1 = t1 * 10 + n1 % 10; n1 /= 10; } while (n2 != 0) { t2 = t2 * 10 + n2 % 10; n2 /= 10; } cout << (t1 > t2 ? t1 : t2) << endl; return 0; }-
能不能枚举 不需要枚举多个情况, 每个数字 逐位处理一次,数据规模很小,一定能做。
-
处理的范围 枚举的是数字的 每一位 范围:从 个位到最高位
-
用循环处理所有“坑” 用
while (n != 0)每次取一位数字,直到所有位都处理完 -
判断 + 提前结束 当数字变成
0时,说明所有位都处理完,循环结束 最后比较反转后的两个数,输出较大的那个
万元万鸡
#include <bits/stdc++.h> #define DEBUG(var) cout << "[DEBUG]" << #var << " = " << var << endl using namespace std; int main() { for (long long i = 4; i * 5 < 10000; i++) { for (long long j = 1; j * 3 < 10000; j++) { long long k = 10000 - i - j; // 计算k的值 if (i + j + k == 10000 && i * 5 + j * 3 + k / 3 == 10000 && k % 3 == 0) { printf("%lld %lld %lld\n", i, j, k); } } } return 0; }和数
#include <bits/stdc++.h> using namespace std; int main() { int n; cin >> n; int a[105]; // n <= 100,数组开大一点更安全 for (int i = 0; i < n; i++) { cin >> a[i]; } int ans = 0; // 枚举目标数 a[k] for (int k = 0; k < n; k++) { bool ok = false; // 枚举两个加数 for (int i = 0; i < n && !ok; i++) { for (int j = 0; j < n; j++) { // 三个下标不能相同 if (i != j && i != k && j != k) { if (a[i] + a[j] == a[k]) { ok = true; break; } } } } if (ok) ans++; } cout << ans << endl; return 0; }进阶
#include <bits/stdc++.h> using namespace std; int main() { int n; cin >> n; int a[105]; bool exist[10001] = {false}; bool used[10001] = {false}; // 防止重复统计同一个“和” for (int i = 0; i < n; i++) { cin >> a[i]; exist[a[i]] = true; } int ans = 0; // 枚举两个加数 for (int i = 0; i < n; i++) { for (int j = i + 1; j < n; j++) { int sum = a[i] + a[j]; // 判断 sum 是否是数组中的“第三个数” if (sum <= 10000 && exist[sum] && !used[sum]) { used[sum] = true; ans++; } } } cout << ans << endl; return 0; } -
最近活动