穷举法

1、介绍

穷举法是将所有的可能性罗列出来,在其中寻找答案的一种方法。理论上讲,穷举法几乎能解决所有问题,但是穷举法通常效率差,就算使用一般也需要做一些优化。

2、实例1

有5个海盗相约进行一次帆船比赛,先后经过一个无名的荒岛,并且每个人都觉得自己是第一个经过该岛的人。 第一个人在沙滩上发现了一堆金币。他把金币分成5等份。发现刚好少一个金币。他就从自己口袋拿出一个金币补充进去,然后把属于自己的那份拿走。第二个到达的人也看到了金币,他也和第一个人一样,把所有金币5等分,发现刚好缺少一个金币,于是自己补进去一个,拿走了属于自己的那份。第三,第四,第五人的情况一模一样。等他们到了目的地,都说自己的情况,才恍然大悟,一起去荒岛找金币,然而再也没有找到荒岛。他们都惋惜地说:岛上还有一千多枚金币呢!请你根据这些信息,推算荒岛上最初有多少金币?

代码实现:(python3)

#海盗离开岛后,接下来另一个海盗还未到岛时,岛上的金币数量为n,判断此n是否符合题意
def panduan(n):
    T=False
    if (n+1)%5==0:
        T=True
    return T

#sum表示起初岛上的金币数量,i表示第i个海盗,返回值表示第i个海盗离开后剩余的金币数量
def sheng(sum,i):
    if i==1:
        return 4 * (sum+1) / 5
    else:
        return 4*(sheng(sum,i-1)+1)/5
#求起初岛上的金币数量(穷举法)
for i in range(1000,5000):#(1000,5000)是通过看出来的,这里也可以做进一步优化
    if panduan(sheng(i,1)) and panduan(sheng(i,2)) and panduan(sheng(i,3)) and panduan(sheng(i,4)):
        if sheng(i,5)>1000 and sheng(i,5)<2000:
            print(i)

3、实例3

现在有n根火柴棍,你可以拼出多少个形如“A+B=C”的等式?等式中的A、B、C是用火柴棍拼出的整数(若该数非零,则最高位不能是0)。用火柴棍拼数字0-9的拼法如图所示:

注意:

  1. 加号与等号各自需要两根火柴棍

  2. 如果A≠B,则A+B=C与B+A=C视为不同的等式(A、B、C>=0)

  3. n根火柴棍必须全部用上

现在只有n(n<=24)根火柴,可以拼多少个等式?

代码实现:(python3)

n = int(input())
list = [6,2,5,5,4,5,6,3,7,6]
#制作0~999对应的火柴棒列表
for i in range(10,100):
    gewei = i%10
    shiwei = i//10
    list.append(list[gewei]+list[shiwei])
for i in range(100,1000):
    baiwei = i//100
    shiwei = i//10
    gewei = i%10
    list.append(list[gewei]+list[shiwei])
    
count = 0  #用于计数
#穷举(部分优化)
for x in range(0,1000):
    if list[x]<=18:
       for y in range(0,1000):
           if (list[x]+list[y]<=18) and ((x+y)<1000 and (list[x]+list[y]+list[x+y]==(n-4))):
                count = count + 1
print(count,end='')
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值