题目地址:砝码称重
此题好像可以用两种方法做,但这里只讲第一种常规方法(因为动态规划方法太难了):
看到此题我们首先想到的必然是怎么将其暴力求出来,首先我们先将其一个一个的放在天平上,但砝码重量难免有相同的,所以我们先设置一个set数组并添加重量0:
ans = set()
set.add(0)
但是要将多个砝码放在两个天平之中方法有很多,但是在砝码依次相加的过程中肯定会超时的,所以我们不妨设立一个process数组用来保存我们中途添加的砝码重量:
process = [0]
对于两端的天平无非就是砝码重量加减的问题,所以我们可以用两个if语句来判断其是否在数组ans里。
完整代码:
n = int(input())
weights = list(map(int, input().split()))
ans = set()
set.add(0)
process = [0]
for weight in weights:
for i in range(len(process)):
if weight + process[i] not in ans: # 砝码重量相加
ans.add(weight + process[i])
process.append(weight + procecss[i])
if abs(weight - process[i]) not in ans: # 砝码重量相减
ans.add(abs(weight - process[i]))
process.append(abs(weight - procecss[i]))
print(len(ans) - 1) # 去掉重量0
对于process数组的使用是此方法比较难以理解的,随着第一个for循环的运行,process内部会不断的添加已经使用过的砝码重量,第二个for循环的运行会不断的加或减我们曾经使用过的砝码重量,从而实现在两天平上添加砝码这一操作。