题解 | #称砝码#

称砝码

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) 文章被收录于专栏

华为实习机试题解

全部评论

相关推荐

不愿透露姓名的神秘牛友
昨天 17:30
找实习找着找着就要进入7月了,马上秋招也要开始了,找实习还有意义吗?
绝迹的星:有面就面, 没面上就当日薪4位数大佬免费培训, 面上了再考虑要不要实习
点赞 评论 收藏
分享
在喝茶的牛油很喜欢吃卤蛋:今天oc了
点赞 评论 收藏
分享
05-12 17:00
门头沟学院 Java
king122:你的项目描述至少要分点呀,要实习的话,你的描述可以使用什么技术,实现了什么难点,达成了哪些数字指标,这个数字指标尽量是真实的,这样面试应该会多很多,就这样自己包装一下,包装不好可以找我,我有几个大厂最近做过的实习项目也可以包装一下
点赞 评论 收藏
分享
是每个人事都这样与找工作的人这样沟通吗?正常询问不可以吗
据说名字越长别人越关注你的昵称我觉得我要被关注了:excal 我还真不会
点赞 评论 收藏
分享
评论
1
4
分享

创作者周榜

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