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)