砝码称重-蓝桥杯真题-python解法

文章介绍了如何使用砝码进行称重组合的可能性计算,关键在于对砝码进行排序,避免重复并提高效率。通过遍历砝码列表,构建不同的重量组合,并利用集合去重,最终得到所有可能的重量。排序使得较小的砝码先被处理,减少大砝码的重复计算,从而节省了时间。
摘要由CSDN通过智能技术生成

题目描述

解题思路 

砝码能称重的可能性就是这些砝码组合的可能性,为了避免重复和完全找到所有可能性。我们应当从第二个砝码开始遍历时就添加他自己以及他和当前列表(该列表由之前的值加减值开始)的值加减组合,然后进行set就是除掉重复,然后再遍历后面的砝码

代码

    n=int(input())
    fama=list(map(int,input().strip().split()))
    fama.sort()
    zuhe=[]
    set_zuhe=set()
    for i in fama:
        if zuhe==[]:
            zuhe.append(i)
            set_zuhe.add(i)
        else:
            #在前面的组合上继续构造
            for j in zuhe:
                set_zuhe.add(i)
                set_zuhe.add(i+j)
                set_zuhe.add(abs(i-j))
            zuhe=list(set_zuhe)
    if 0 in zuhe:
        zuhe.remove(0)
    print(len(zuhe))

这里有一个技巧就是,当我们拿到砝码的列表时,我们sort一下让最小的排在最前面,这样会节约时间。如果你不排序当较大的数出现在前面时,大的数就会在循环里多次被计算,会增加时间,而排序后就是小的数计算次数肯定大于大的数,就可以节约时间

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值