本文已参与「新人创作礼」活动,一起开启掘金创作之路。
题目来自牛客网的华为机试题库,本题目为中等题HJ41 称砝码
HJ41 称砝码
描述
现有n种砝码,重量互不相等,分别为 m1,m2,m3…mn ;
每种砝码对应的数量为 x1,x2,x3...xn 。现在要用这些砝码去称物体的重量(放在同一侧),问能称出多少种不同的重量。
注:
称重重量包括 0
数据范围:每组输入数据满足
输入描述:
对于每组测试数据:
第一行:n --- 砝码的种数(范围[1,10])
第二行:m1 m2 m3 ... mn --- 每种砝码的重量(范围[1,2000])
第三行:x1 x2 x3 .... xn --- 每种砝码对应的数量(范围[1,10])
输出描述:
利用给定的砝码可以称出的不同的重量数
示例1
输入:
2
1 2
2 1
输出:
5
说明:
可以表示出0,1,2,3,4五种重量。
代码
n = int(input())
dic = {}
x = list(map(int, input().split()))
m = list(map(int, input().split()))
for i in range(len(m)):
dic[x[i]] = m[i]
l = []
for i in dic:
l_ =[i] * dic[i]
l.extend(l_)
weights = {0,}
for i in l:
for j in list(weights):
weights.add(i+j)
print(len(weights))
解析
代码写起来很简单,放到中等题里可能是因为想到这么写比较难吧。
具体方法:
1.读入两行数据,用split拆分开
2.把读入的两行,砝码重量和每种砝码个数匹配起来
3.把每个砝码分开保存在一个数列里,比如有两个重量为1g的砝码,则保存成,[1,1],方便接下来的相加
4.对数列中的重量进行遍历,保存到集合weights中(因为集合可以自动去重),并且不断把l和weights中的元素进行相加生成新的可表示重量,同时把它加入weights,要记得不要忘记0元素。
5.weights就是所有可表示重量,weights长度即为所求。