题解 | #称砝码#

称砝码

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`次,即可。

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务