题解 | #称砝码#
称砝码
https://www.nowcoder.com/practice/f9a4c19050fc477e9e27eb75f3bfd49c
n = int(input())
weights = list(map(int, input().split()))
numbers = list(map(int, input().split()))
hashset = set()
# def dfs(now, sum):
# if now == n:
# hashset.add(sum)
# # print(now, sum)
# return
# for i in range(numbers[now]+1):
# dfs(now + 1, sum + i * weights[now])
# dfs(0, 0)
# print(len(hashset))
# 动态规划
ans = {0}
for i in range(n):
w = weights[i]
for num in range(numbers[i]):
tmp = ans.copy()
for x in tmp:
ans.add(x + w)
# print(w, num, ans)
print(len(ans))
一开始用了暴力法,果断超时了。后来发现动态规划,假设我有一堆砝码和它们能称出来的所有重量,现在往里面加入一个砝码,那么能称的所有重量就是 `S := set(w + s for s in S)`,这就得到转移方程。
注意我们要模拟每次加一个砝码的过程,如果完全不加那就是初始状态,每次加一个`w`,一共加`num`次,即可。
查看15道真题和解析