题解 | #称砝码#
称砝码
https://www.nowcoder.com/practice/f9a4c19050fc477e9e27eb75f3bfd49c
高赞的代码解析:
思路是枚举,以题目给的案例,按照习惯可轻松写出不同的重量组合,但是每种重量的砝码组合可能会有多种,需要去重。
将每种砝码从1个到最大数量时所能表示的重量都放入哈希表中,每次放入之前,先遍历哈希表,取出前一种砝码的所有重量,每取一个就进行组合,组合后的重量再放回哈希表种,由此得到最终结果。
import java.util.*; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); while (in.hasNextInt()) { // 注意 while 处理多个 case HashSet<Integer> set = new HashSet<>();//去重存放所有可能的结果 set.add(0);//初始化为0,0是唯一一个已知的可以表示的重量 int n = in.nextInt();//砝码种类数 int[] w = new int[n];//砝码重量 int[] nums = new int[n];//砝码数量 for (int i = 0; i < n; i++) { w[i] = in.nextInt();//砝码的重量 } for (int i = 0; i < n; i++) { nums[i] = in.nextInt();//砝码个数 } for (int i = 0; i < n; i++) { //遍历砝码:i是砝码种类 //截止目前,已用过的砝码可表示的不同重量数 ArrayList<Integer> list = new ArrayList<>(set); for (int j = 1; j <= nums[i];j++) { //遍历个数,nums[i]是砝码i的数量,砝码i的使用数量从1到nums[i] int jW = w[i] * j; for (int k = 0; k < list.size(); k++) { int tempW = list.get(k); //更新set中的重量终类 set.add(tempW + jW); //j个砝码i的重量:w[i] * j } } } System.out.println(set.size()); } } }