题解 | #称砝码#
理解别人的代码后加入一些注释,方便自己理解。
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(); } }