import java.util.ArrayList; import java.util.List; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); int[] m = new int[n]; for (int i = 0; i < n; i++) { m[i] = scanner.nextInt(); } int[] x = new int[n]; for (int i = 0; i < n; i++) { x[i] = scanner.nextInt(); } int sum = 0; for (int i = 0; i < n; i++) { sum += m[i] * x[i]; } boolean[] dp = new boolean[sum + 1]; dp[0] = true; for (int i = 0; i < n; i++) { int mi = m[i]; int xi = x[i]; List<Integer> di = new ArrayList<>(); for (int k = 0; k <= xi; k++) { di.add(k * mi); } boolean[] temp = new boolean[sum + 1]; for (int j = 0; j <= sum; j++) { if (dp[j]) { for (int d : di) { if (j + d <= sum) { temp[j + d] = true; } } } } dp = temp; } int count = 0; for (boolean b : dp) { if (b) { count++; } } System.out.println(count); } }
https://www.nowcoder.com/discuss/727521113110073344
思路:
1.输入处理:读取砝码种类数、砝码重量数组和数量数组。
2.总重量计算:计算所有砝码的最大可能总重量。
3.动态规划初始化:初始化dp数组,只有重量0是可能的。
4.处理每个砝码:生成当前砝码的所有可能增量,并使用这些增量更新动态规划数组。
5.结果统计:统计动态规划数组中为true的元素数量。