1.题目
【问题描述】
你有一架天平和 $N$个砝码,这 $N$个砝码重量依次是 $W_1, W_2, · · · , W_N$。 请你计算一共可以称出多少种不同的重量? 注意砝码可以放在天平两边。
【输入格式】
输入的第一行包含一个整数 $N$。
第二行包含 $N$个整数:$W_1, W_2, · · · , W_N$。
【输出格式】
输出一个整数代表答案。
【样例输入】
3
1 4 6
【样例输出】
10
【样例说明】
能称出的 10 种重量是:1、2、3、4、5、6、7、9、10、11。
1 = 1;
2 = 6 − 4 (天平一边放 6,另一边放 4);
3 = 4 − 1;
4 = 4;
5 = 6 − 1;
6 = 6;
7 = 1 + 6;
9 = 4 + 6 − 1;
10 = 4 + 6;
11 = 1 + 4 + 6。
2. 题解
2.1 思路分析
增加一个砝码会增加的新的称重组合为
1.原来的各种称重组合+该砝码的重量
2.原来的各种称重组合-该砝码的重量(0除外)
3.该砝码本身的重量
当只有一个砝码的时候称重组合为该砝码本身的重量
由此形成了动态规划链
2.2 代码实现
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int[] weights = new int[n];
for (int i = 0; i < n; i++) {
weights[i] = scanner.nextInt();
}
Set<Integer> set = new HashSet<>();//用来存储最终可能的组合,set可以自动去重
set.add(weights[0]);
for (int i = 1; i < n; i++) {
List<Integer> tmpList = new ArrayList<>(set);
for(Integer item:tmpList){
if(item!=weights[i]){//避免出现称出0的情况
set.add(Math.abs(item-weights[i]));
}
set.add(item+weights[i]);
}
set.add(weights[i]);
}
System.out.println(set.size());
}
}
2.3 提交结果
评测点序号 | 评测结果 | 得分 | CPU使用 | 内存使用 | 下载评测数据 |
---|---|---|---|---|---|
1 | 正确 | 10.00 | 78ms | 22.23MB | 输入 输出 |
2 | 正确 | 10.00 | 109ms | 22.33MB | VIP特权 |
3 | 正确 | 10.00 | 78ms | 22.32MB | VIP特权 |
4 | 正确 | 10.00 | 140ms | 22.33MB | VIP特权 |
5 | 正确 | 10.00 | 62ms | 22.68MB | VIP特权 |
6 | 正确 | 10.00 | 109ms | 23.85MB | VIP特权 |
7 | 正确 | 10.00 | 78ms | 26.24MB | VIP特权 |
8 | 正确 | 10.00 | 171ms | 33.07MB | VIP特权 |
9 | 正确 | 10.00 | 218ms | 64.09MB | VIP特权 |
10 | 正确 | 10.00 | 234ms | 90.59MB | VIP特权 |
评论 (0)