第1次课枚举算法
1、核心思想
枚举算法简单直接 ,它直接对问题所有可能情况进行列举,尽可能地尝试所有的方法。它的基本 思想是将问题中每个可能的解都枚举处理 ,并进行验证 ,找到满足条件的解或者所有解。
核心就是:枚举所有的可能。
2、做题思路
枚举的思路是:“将问题的所有可能的答案一一列举,然后根据条件判断此答案是否合适,保留合适的 ,舍弃不合适的”。枚举的思路可以分三步走:
1、枚举对象:题目求什么?要针对哪个对象循环?应该用多少个循环?
2、枚举范围:循环的边界怎么限定?
3、枚举条件:什么情况枚举能够成功?if 怎么写?有没有嵌套最值问题?
3、经典枚举问题分类
1. 求满足条件的数
2. 百鸡问题
3. 限定两个元素的组合
3.1 满足条件的数
【例题】水仙花数
什么是水仙花数 ,首先它是一个三位整数。这个三位整数满足如下情况; 例如 153 满足 :
1*1*1+5*5*5+3*3*3 =153。那么请输出所有的水仙花数 ,中间用空格隔开。
【问题分析】按照枚举的三部曲走:
1. 枚举对象:题目求什么?求满足条件的三位数 ,故 for 循环枚举需要针对的是三位数 ,需要 一个 for 循环。
2. 枚举范围:水仙花数是一位三位整数 ,故枚举范围为 100~999。
3. 枚举条件:什么情况下枚举成功?我们需要对每一个数字进行尝试 ,判断其是否满足如下条
件 ,例如:
100 拆分计算: 1*1*1 + 0*0*0 + 0*0*0 = 1 ! = 100 ----条件不成立
101 拆分计算: 1*1*1 + 0*0*0 + 1*1*1 = 2 ! = 101 ----条件不成立
153 拆分计算: 1*1*1 + 5*5*5 + 3*3*3 = 153 ==153 --- 条件成立
#include <bits/stdc++.h>
using namespace std;
int main() {
for (int i = 100; i <= 999; i++) {//枚举对象i
int a = i % 10; // 个位
int b = i / 10 % 10; // 十位
int c = i / 100; // 百位
if (a * a * a + b * b * b + c * c * c == i) {//枚举条件
cout << i << endl;
}
}
return 0;
}