题解 | #称砝码#
称砝码
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) 文章被收录于专栏
华为实习机试题解