思路:
我们需要逐步考虑每个砝码的重量,然后计算在放置或不放置当前砝码的情况下所能得到的新重量。这个过程可以看作是一个状态空间的逐步扩展过程,而广度优先搜索算法正是用来逐层扩展搜索范围的。
具体来说,我们可以将每个状态看作是一个重量,然后考虑在当前状态下放置或不放置当前砝码后得到的新状态。这些新状态可以看作是当前状态的“邻居”,而广度优先搜索算法正是用来逐步考虑每个状态的邻居,并逐层扩展搜索范围的。
另外,这个问题中我们需要找出可以称出的不同重量的数量,而广度优先搜索算法适用于需要找到最短路径或者最优解的问题,因为它能够保证在搜索过程中逐步扩展,直到找到目标状态。在这个问题中,我们需要找到所有可能的重量状态,因此广度优先搜索算法可以确保在最短步数内找到所有可能的状态,从而得到问题的解。
因此,这个问题可以使用广度优先搜索算法来逐步计算可以称出的不同重量的数量,确保在最短步数内找到所有可能的重量状态,从而得到问题的解。
BFS(广度优先搜索)就是以最开始的砝码重量为根节点,每一层即为前面所有节点的重量和当前砝码相加减以及单独的砝码所能称出的不同的重量
在题目中要求的是不同重量,但存在不同砝码组合组成相同重量,这时我们可以用集合存储可以称出的重量,以免重复计数
代码
n = int(input())
famas = list(map(int,input().split()))
w = set()#能称出的重量集合
for i in range(0,n):
t = list(w)#将目前能够惩处的重量集合转化为列表,便于遍历
for j in range(len(t)):
w.add(famas[i]+t[j])#能够称出的重量与现在的砝码重量相加
if (famas[i]-t[j])!=0:##能够称出的重量与现在的砝码重量相减,可能会等于0,去除这种情况
w.add(abs(famas[i]-t[j]))
w.add(famas[i])#加上只放置当前砝码的情况
print(len(w))
感觉这个不是典型的BFS赛题,如果有更好的想法和思路欢迎评论区留言交流