题目
你有一架天平和 个砝码,这 个砝码重量依次是 。
请你计算一共可以称出多少种不同的重量? 注意砝码可以放在天平两边。
输入格式
输入的第一行包含一个整数 。
第二行包含 个整数:。
输出格式
输出一个整数代表答案。
样例输入
3
1 4 6
样例输出
10
样例说明
能称出的 种重量是:。
;
(天平一边放 ,另一边放 );
;
;
;
;
;
;
;
。
评测用例规模与约定
对于 的评测用例,。
对于所有评测用例,, 个砝码总重不超过 。
运行限制
- 最大运行时间:1s
- 最大运行内存: 256M
解题
方法一:枚举
思路
每多一种砝码就与之前能称出的所有重量做和或做差,得到新的能称出的重量。
注意:
- 遍历过程中如果修改原集合会引发并发修改异常,所以要建一个新的集合存新重量,遍历完成后再合并集合。
- 重量 不能被称出,要特判。
代码
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
in.nextToken();
int n = (int) in.nval;
Set<Integer> ans = new HashSet<>();
while (n-- > 0) {
in.nextToken();
int x = (int) in.nval;
Set<Integer> st = new HashSet<>();
for (int y : ans) {
st.add(x + y);
st.add(Math.abs(x - y));
}
ans.add(x);
ans.addAll(st);
}
System.out.println(ans.size() - (ans.contains(0) ? 1 : 0));
}
}
评论区