题解 | #称砝码#不能直接in.nextInt 空指针异常
称砝码
https://www.nowcoder.com/practice/f9a4c19050fc477e9e27eb75f3bfd49c
import java.util.*;//模板
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
while (in.hasNextLine()) { // 注意 while 处理多个 case
//砝码种类
String nstr=in.nextLine();
int n=Integer.parseInt(nstr);//不能直接in.nextInt 空指针异常,不知道为什么,评论区解释一下
//各砝码重量
String[] wsSting = in.nextLine().split(" ");
int[] ws = new int[n];
for (int i = 0; i < wsSting.length; i++) {
ws[i] = Integer.parseInt(wsSting[i]);
}
String[] numsSting = in.nextLine().split(" ");
//各砝码个数
int[] nums = new int[n];
for (int i = 0; i < numsSting.length; i++) {
nums[i] = Integer.parseInt(numsSting[i]);
}
//所有砝码重量组合情况set,去重且排好序 ----- 可扩展为有序输出可称重量的数值
Set<Integer> treeSet = new TreeSet<>();
//由示例可知,0重量也属于一种情况
treeSet.add(0);
//每一种砝码
for (int i = 0; i < n; i++) {
//前i种砝码组合出的重量,treeSet可看作成员变量,treeSeti 看作临时变量
Set<Integer> treeSeti = new TreeSet<>(treeSet);
//第i种砝码取多少个
for (int k = 1; k <= nums[i]; k++) {
//i种砝码取k个的重量
int w_add = ws[i] * k;
//遍历前i种砝码组合treeSeti,在第i+1种下挨个计算
for (Integer w : treeSeti) {
//+第i+1种的k个到总数集合treeSet,不是treeSeti
int new_w= w+w_add;
treeSet.add(new_w);
}
}
}
System.out.println(treeSet.size());
}
}
}

