蓝桥杯|历届真题:砝码称重

jupiter
2022-03-17 / 0 评论 / 555 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2022年03月17日,已超过821天没有更新,若内容或图片失效,请留言反馈。

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.0078ms22.23MB输入 输出
2正确10.00109ms22.33MBVIP特权
3正确10.0078ms22.32MBVIP特权
4正确10.00140ms22.33MBVIP特权
5正确10.0062ms22.68MBVIP特权
6正确10.00109ms23.85MBVIP特权
7正确10.0078ms26.24MBVIP特权
8正确10.00171ms33.07MBVIP特权
9正确10.00218ms64.09MBVIP特权
10正确10.00234ms90.59MBVIP特权

参考资料

  1. 蓝桥杯试题 历届真题 砝码称重【第十二届】【省赛】【JAVAB组】
  2. http://lx.lanqiao.cn/problem.page?gpid=T2895
0

评论 (0)

打卡
取消