问题描述
你有一架天平和 �N 个砝码,这 �N 个砝码重量依次是 �1,�2,⋅⋅⋅,��W1,W2,⋅⋅⋅,WN。
请你计算一共可以称出多少种不同的重量? 注意砝码可以放在天平两边。
输入格式
输入的第一行包含一个整数 �N。
第二行包含 �N 个整数:�1,�2,�3,⋅⋅⋅,��W1,W2,W3,⋅⋅⋅,WN。
输出格式
输出一个整数代表答案。
样例输入
3
1 4 6
样例输出
10
样例说明
能称出的 1010 种重量是:1、2、3、4、5、6、7、9、10、111、2、3、4、5、6、7、9、10、11。
1=1;1=1;
2=6−4(2=6−4(天平一边放 66,另一边放 4);4);
3=4−1;3=4−1;
4=4;4=4;
5=6−1;5=6−1;
6=6;6=6;
7=1+6;7=1+6;
9=4+6−1;9=4+6−1;
10=4+6;10=4+6;
11=1+4+6。11=1+4+6。
评测用例规模与约定
对于 5050的评测用例,1≤�≤151≤N≤15。
对于所有评测用例,1≤�≤100,�1≤N≤100,N个砝码总重不超过 100000100000。
运行限制
- 最大运行时间:1s
- 最大运行内存: 256M
import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StreamTokenizer;
import java.util.*;
public class Main{
private static int[] weights;
private static Set<Integer> set = new HashSet<>();
public static void main (String[] args)throws IOException {
PrintWriter out = new PrintWriter(System.out);
StreamTokenizer in = new StreamTokenizer(new BufferedInputStream(System.in));
in.nextToken();int N = (int) in.nval;
weights = new int[N];
for(int i=0;i<N;i++){
in.nextToken();
weights[i] = (int) in.nval;
// set.add(weights[i]);
}
set.add(0);
for(int i=0;i<N;i++){
List<Integer> list = new ArrayList<>(set);
for(int j:list){
set.add(weights[i]+j);
set.add(Math.abs(weights[i]-j));
}
}
out.print(set.size()-1);
out.flush();
}
// private static void DFS(int n,int leftWeight,int rightWeight){
// int newNum = Math.abs(leftWeight-rightWeight);
// if (!set.contains(newNum)){
// set.add(newNum);
System.out.println(leftWeight+","+rightWeight+"-->"+newNum);
// }
// if (n == weights.length){
// return;
// }
//
// //1.
// DFS(n+1,leftWeight + weights[n],rightWeight);
// //2.
// DFS(n+1,leftWeight,rightWeight + weights[n]);
// //3.
// DFS(n+1,leftWeight,rightWeight);
// }
}