题解 | #称砝码#
称砝码
https://www.nowcoder.com/practice/f9a4c19050fc477e9e27eb75f3bfd49c
import java.util.*; // 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); // 注意 hasNext 和 hasNextLine 的区别 // while (in.hasNextInt()) { // 注意 while 处理多个 case // int a = in.nextInt(); // int b = in.nextInt(); // System.out.println(a + b); // } int n = in.nextInt(); int[] mn = new int[n]; int[] xn = new int[n]; int num = 0; int max = 0; while (in.hasNextInt()) { for (int i = 0; i < n; i++) { mn[i] = in.nextInt(); } for (int i = 0; i < n; i++) { xn[i] = in.nextInt(); num = num + xn[i]; } } int[] mx = new int[num]; int index = 0; for (int i = 0; i < n; i++) { max = max + mn[i] * xn[i]; for (int j = 0; j < xn[i]; j++) { mx[index] = mn[i]; index++; } } boolean[][] dp = new boolean[num + 1][max + 1]; for (int i = 0; i <= num; i++) { dp[i][0] = true; } HashSet<Integer> ws = new HashSet<>(); ws.add(0); for (int i = 1; i <= num; i++) { int w = mx[i - 1]; for (int j = 1; j <= max; j++) { dp[i][j] = dp[i - 1][j]; if (j - w < 0) { continue; } dp[i][j] = dp[i - 1][j - w] || dp[i - 1][j]; if (dp[i][j]) { ws.add(j); } } } System.out.print(ws.size()); } }