枚举法

枚举法

在进行归纳推理时,如果逐个考察了某类事件的所有可能情况,因而得出一般结论,那么这结论是可靠的,这种归纳方法叫做枚举法
问题解决思路
思考真正困难所在

提出较好解决方案

思想

将问题所有可能存在的答案一一列举,然后根据条件判断这个答案不是不是合适,是就保留,不是就舍弃

解题思路

  1. 确定要枚举的对象,范围和判定条件.
  2. 逐一枚举可能的解并验证每个解是不是问题的解.

枚举算法步骤

(1)确定解题的可能范围,不能遗漏任何一个真正解,同时避免重复。

(2)判定是否是真正解的方法。

(3)为了提高解决问题的效率,使可能解的范围将至最小,

代码实现

如果a+b+c=100,而且 a^2+b^2=c^2(a,b,c为自然数),问如何求出所有a,b,c可能存在的组合

1568818491093

a,b,c从0开始 枚举法最笨的一个方法

  1. 先让其中一个数去变,其他两个数先不动, 怎么实现?
    嵌套循环
  2. 实现a+b+c=1000,和a*2+b*2=c*2
    写上两个判断,a+b+c=1000,和a*
    2+b**2=c**2 判断条件
  3. 写一个计时器
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的时间,只是因为少了一个判断,(每个人电脑性能不一样)

减少让计算机运算时间

posted @ 2019-09-22 15:46  Huise.J  阅读(650)  评论(0编辑  收藏  举报