枚举法
在进行归纳推理时,如果逐个考察了某类事件的所有可能情况,因而得出一般结论,那么这结论是可靠的,这种归纳方法叫做枚举法
问题解决思路
思考真正困难所在
提出较好解决方案
思想
将问题所有可能存在的答案一一列举,然后根据条件判断这个答案不是不是合适,是就保留,不是就舍弃
解题思路
- 确定要枚举的对象,范围和判定条件.
- 逐一枚举可能的解并验证每个解是不是问题的解.
枚举算法步骤
(1)确定解题的可能范围,不能遗漏任何一个真正解,同时避免重复。
(2)判定是否是真正解的方法。
(3)为了提高解决问题的效率,使可能解的范围将至最小,
代码实现
如果a+b+c=100,而且 a^2+b^2=c^2(a,b,c为自然数),问如何求出所有a,b,c可能存在的组合
a,b,c从0开始 枚举法最笨的一个方法
- 先让其中一个数去变,其他两个数先不动, 怎么实现?
嵌套循环 - 实现a+b+c=1000,和a*2+b*2=c*2
写上两个判断,a+b+c=1000,和a*2+b**2=c**2 判断条件 - 写一个计时器
import time #测试时间
start_time=time.time()
for a in range(0,1001):
for b in range(0,1001):
for c in range(0,1001):
if a+b+c==1000 and a**2 +b**2==c**2:
print(a,b,c)
end_time=time.time()
print(f'花费时间{end_time-start_time}')#测试时间
print('finished')#结束标志
##结果
0 500 500
200 375 425
375 200 425
500 0 500
花费时间352.2528417110443
finished
思路优化(有了结果不需要判断)
改进
因为c==1000-a-b 有了c的结果之后 就不需要再对c进行判断,
那么直接判断第二个条件,
import time #测试时间
start_time=time.time()
for a in range(0,1001):
for b in range(0,1001):
c=1000-a-b
if a+b+c==1000 and a**2 +b**2==c**2:
print(a,b,c)
end_time=time.time()
print(f'花费时间{end_time-start_time}')#测试时间
print('finished')#结束标志
##结果
0 500 500
200 375 425
375 200 425
500 0 500
花费时间2.135776996612549
finished
结果分析(缩短近150倍)
花费时间仅需要2s钟,缩短近150倍!!!
减少350s的时间,只是因为少了一个判断,(每个人电脑性能不一样)
减少让计算机运算时间