题解 | #称砝码#

称砝码

https://www.nowcoder.com/practice/f9a4c19050fc477e9e27eb75f3bfd49c

思路:依次遍历砝码,将砝码重量的组合存入到set中,对每一个砝码,都可以与之前已经存入set的重量组合再次进行组合,所以对于第i个砝码,需要先将前面i-1个砝码的重量组合先存入到临时tempSet中,再将其与第i个砝码进行组合的值放入set中

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNextLine()) {
            //依次读取砝码种数、重量、数量
            int n = Integer.parseInt(sc.nextLine().trim());
            String[] m = sc.nextLine().split("\\s+");
            String[] x = sc.nextLine().split("\\s+");

            //将砝码的重量按其个数存入list中
            ArrayList<Integer> list = new ArrayList<>();
            for (int i = 0; i < n; i++) {
                int weight = Integer.parseInt(m[i]);
                int num = Integer.parseInt(x[i]);
                for (int j = 0; j < num; j++) {
                    list.add(weight);
                }
            }

            //用能自动去重的set来存放砝码的重量组合,先放入0到set中
            Set<Integer> set = new HashSet<>();
            set.add(0);

            //对存放砝码重量的list进行遍历
            for (int i = 0; i < list.size(); i++) {
                //对每一个砝码,都可以与已存入set的重量值进行组合(即将重量相加)
                //故先将原set的重量值复制到临时tempSet中,对其进行遍历
                Set<Integer> tempSet = new HashSet<>(set);
                for (int v : tempSet) {
                    set.add(v + list.get(i));
                }
            }

            //最终得到的set的大小即为重量组合的个数
            System.out.println(set.size());
        }
    }
}
全部评论

相关推荐

10-30 22:18
已编辑
毛坦厂中学 C++
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务