题目描述
现有n种砝码,重量互不相等,分别为 m1,m2,m3…mn ;
每种砝码对应的数量为 x1,x2,x3…xn 。现在要用这些砝码去称物体的重量(放在同一侧),问能称出多少种不同的重量。
注:
称重重量包括 0
数据范围:每组输入数据满足 1≤n≤101 \le n \le 101≤n≤10, 1≤mi≤20001 \le m_i \le 20001≤mi≤2000,1≤xi≤101 \le x_i \le 101≤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))
文章讨论了一个使用不同数量和重量的砝码进行称重的问题,给出两种解决方案:一种基于深度优先搜索(DFS)的递归方法,另一种利用集合去重的策略。这两种方法都在尝试找出所有可能的重量组合,但DFS在某些情况下可能会导致超时。集合去重的方法通过列表和集合操作避免了重复的重量计算。

2293

被折叠的 条评论
为什么被折叠?



