题解 | #称砝码#

称砝码

http://www.nowcoder.com/practice/f9a4c19050fc477e9e27eb75f3bfd49c

while True:
    try:
        num = int(input())
        m_num = input()
        m_num = m_num.split() #所有砝码的重量
        x_num = input()
        x_num = x_num.split() #每种重量砝码的数量
        sum_num = []
        i = 0
        all_num = [0] #0也作为一项,因为题目要求要把0当成一种,all_num作为现有所有砝码的可成出来的重量
        for i in range(len(m_num)):
            for j in range(int(x_num[i])):
                sum_num.append(int(m_num[i])) #把每个砝码的重量都单独作为一项
        i = 0
        for i in range(len(sum_num)):
            for j in range(len(all_num)):
                all_num.append(all_num[j] + sum_num[i]) #all_num的每一项都要加上遍历到的砝码并将之作为新的一项加入到all_num中
            all_num = set(all_num) #去重,因为两个同样的砝码之后加上任何的砝码或不加砝码得到的结果都没有区别,反而会导致列表所占有的内存过大
            all_num = list(all_num)
        print(len(all_num)) #输出能称出来的所有重量的种类
    except:
        break

比如初始有2个重量为1的砝码,一个重量为2的砝码,all_num列表从初始为[0],代表不放任何砝码,sum_num为[1,1,2]代表现有的所有砝码及其重量。第一次循环all_num = [0,1],代表两种情况:第一种是不放这个砝码,第二种是放这个砝码;第二次循环all_num = [0,1,1,2] 0代表两个都不发,第一个1代表只放第一个1,第二个1代表只放第二个1,2代表放两个1.但是两个1在放了1个1的基础上如何操作后面的砝码的结果都可以由一个1来表示就足够了(两个1都放除外),所以删除一个1,后面以此类推。

华为机试题解(prod.by kedao) 文章被收录于专栏

华为实习机试题解

全部评论

相关推荐

字节一直是我的白月光,考虑到转正还是拒了日常实习。
从今天开始狠狠卷JV...:为什么你释放的offer没流到我头上
点赞 评论 收藏
分享
06-26 17:24
已编辑
宁波大学 Java
一口洪烧肉:哈哈哈哈哈哈哈哈哈哈哈硬要啊
点赞 评论 收藏
分享
05-13 02:01
已编辑
惠州学院 前端工程师
安静的少年在求佛:建议把公司名字写到标题。以后有人想搜就能直接搜到
点赞 评论 收藏
分享
昨天 17:14
中北大学 Java
兄弟们是真是假
牛客46374834...:我在boss上投java岗从来没成功过
点赞 评论 收藏
分享
评论
1
4
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务