用python写代码,题目描述 你有一架天平和 N 个砝码,这 N 个砝码重量依次是 W1, W2, · · · , WN。 请你计算一共可以称出多少种不同的重量? 注意砝码可以放在天平两边。 输入 输入的第一行包含一个整数 N。 第二行包含 N 个整数:W1, W2, W3, · · · , WN。 输出 输出一个整数代表答案。
时间: 2024-01-18 07:01:58 浏览: 115
可以使用动态规划来解决这个问题。
假设当前有 i 个砝码,已经称出了 j 种重量,考虑第 i+1 个砝码的贡献:
1. 不放在天平上,此时已经称出的重量种数不变,即 dp[i+1][j] = dp[i][j];
2. 放在天平左边,此时已经称出的重量种数增加,即 dp[i+1][j+wi] = 1,其中 wi 表示第 i+1 个砝码的重量;
3. 放在天平右边,同理,即 dp[i+1][abs(j-wi)] = 1。
最终的答案就是 dp[N][0] + dp[N][1] + ... + dp[N][sum(W)]。
代码实现如下:
```python
n = int(input())
w = list(map(int, input().split()))
max_sum = sum(w)
dp = [[0] * (max_sum+1) for _ in range(n+1)]
dp[0][0] = 1
for i in range(n):
for j in range(max_sum+1):
dp[i+1][j] = dp[i][j]
if j >= w[i]:
dp[i+1][j] |= dp[i][j-w[i]]
dp[i+1][j-w[i]] |= dp[i][j]
print(sum(dp[n]))
```
阅读全文