题解 | #称砝码#
理解别人的代码后加入一些注释,方便自己理解。
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = Integer.parseInt(sc.nextLine());
String[] weightStr = sc.nextLine().trim().split(" ");
String[] numberStr = sc.nextLine().trim().split(" ");
int[] weight = new int[n];
int[] number = new int[n];
for (int i = 0; i < n; i++) {
weight[i] = Integer.parseInt(weightStr[i]);
}
for (int i = 0; i < n; i++) {
number[i] = Integer.parseInt(numberStr[i]);
}
System.out.println(getWeight(n, weight, number));
}
/**
以第一个砝码为基础,在其基础上不断添加。
砝码1的数量为1,则两种种情况:0 1
砝码2的数量为2,则三种种情况:0 2 4
在砝码1的基础上添加砝码2,则有:0 1、2 3、4 5,去重为:0 1 2 3 4 5
*/
public static int getWeight(int n, int[] weight, int[] number) {
Set<Integer> set = new HashSet<>();
set.add(0); // 此0为砝码0的前置情况
// 遍历砝码 i
for (int i = 0; i < n; i++) {
ArrayList<Integer> list = new ArrayList<>(set);
// 对于砝码 i,遍历其数量 j
for (int j = 0; j <= number[i]; j++) {
// 对于砝码 i,选择其个数为 0 - j 之间,加上其余砝码的情况
// weight[i] * j:表示j个砝码i可以组成的数字
// 遍历k表示:表示j个砝码i可以组成的数字 依次 加上 jj个砝码ii可以组成的数字
// 其中ii表示 i 前面的砝码
for (int k = 0; k < list.size(); k++) {
set.add(list.get(k) + weight[i] * j);
}
}
}
return set.size();
}
}
阿里云成长空间 794人发布