题目描述
现有n种砝码,重量互不相等,分别为 m1,m2,m3…mn ;
每种砝码对应的数量为 x1,x2,x3…xn 。现在要用这些砝码去称物体的重量(放在同一侧),问能称出多少种不同的重量。
注:
称重重量包括 0
数据范围:每组输入数据满足
1
≤
n
≤
10
1 \le n \le 10
1≤n≤10,
1
≤
m
i
≤
2000
1 \le m_i \le 2000
1≤mi≤2000,
1
≤
x
i
≤
10
1 \le x_i \le 10
1≤xi≤10
输入描述
对于每组测试数据:
第一行:n — 砝码的种数(范围[1,10])
第二行:m1 m2 m3 … mn — 每种砝码的重量(范围[1,2000])
第三行:x1 x2 x3 … xn — 每种砝码对应的数量(范围[1,10])
输出描述
利用给定的砝码可以称出的不同的重量数
代码&解释
递归
牛客运行超时,只能通过45%用例。
思路是每放上一个砝码就递归一次,用字典res记录未出现过的重量,最后输出res的长度即为所求
"""
DFS求出所有方案
"""
n = int(input()) # 砝码种类数
m = list(map(int,input().split()))
x = list(map(int,input().split()))
total_weight=0
for i in range(n):
total_weight+=x[i]*m[i] # 砝码的总重
res={0,}
def DFS(fama):
weight=0
for i in range(n):
weight+=fama[i]*m[i]
# 记录未出现过的称出重量
res.add(weight)
# 如果当前所有砝码已经用完,结束递归
if weight==total_weight:
return 'finish'
else:
for i in range(n):
if x[i]>fama[i]: # 如果该种类砝码还有,上天平
tmp=fama[:]
tmp[i]+=1
DFS(tmp)
fama=[0 for _ in x] # 记录当前放上的每种砝码的数目
DFS(fama)
print(len(res))
集合去重
tmp_list记录每种砝码能称出的所有重量,把每个结果视为一个整体/砝码
list_weight则是通过嵌套两层循环加上set函数模拟了砝码称重的情况:在一个循环当中,list_weight表示当前天平上已有的重量。因此我们外层遍历tmp_list时,等价与将一个新的砝码放上天平,list_weight实时更新。
set函数可以帮助去重。
import sys
n = int(input())
m = list(map(int,input().split()))
x = list(map(int,input().split()))
list_weight = [0]
for idx in range(n):
tmp_list = [m[idx]*i for i in range(x[idx]+1)]
list_weight = list(set(a+b for a in tmp_list for b in list_weight))
print(len(list_weight))