import java.util.ArrayList; import java.util.HashSet; import java.util.Scanner; /** * HJ41 称砝码 * @author d3y1 */ public class Main { private static int n; private static HashSet<Integer> set = new HashSet<>(); public static void main(String[] args) { // solution1(); solution2(); // solution3(); } /** * dfs: 超时! */ private static void solution1(){ Scanner in = new Scanner(System.in); // 砝码种类 n = in.nextInt(); // 砝码重量 int[] m = new int[n]; // 砝码数量 int[] x = new int[n]; for(int i=0; i<n; i++){ m[i] = in.nextInt(); } for(int i=0; i<n; i++){ x[i] = in.nextInt(); } dfs(m, x, 0, 0); System.out.println(set.size()); } /** * dfs * @param m * @param x * @param idx * @param sum */ private static void dfs(int[] m, int[] x, int idx, int sum){ set.add(sum); if(idx == n){ return; } // 此处耗时 for(int i=idx; i<n; i++){ for(int j=0; j<=x[i]; j++){ dfs(m, x, i+1, sum+m[i]*j); } } } /** * 哈希 */ private static void solution2(){ Scanner in = new Scanner(System.in); // 砝码种类 n = in.nextInt(); // 砝码重量 int[] m = new int[n]; // 砝码数量 int[] x = new int[n]; for(int i=0; i<n; i++){ m[i] = in.nextInt(); } for(int i=0; i<n; i++){ x[i] = in.nextInt(); } set.add(0); ArrayList<Integer> weights; for(int i=0; i<n; i++){ weights = new ArrayList<>(set); for(int weight: weights){ for(int j=1; j<=x[i]; j++){ set.add(weight+m[i]*j); } } } System.out.println(set.size()); } /** * 动态规划 */ private static void solution3(){ Scanner in = new Scanner(System.in); // 砝码种类 n = in.nextInt(); // 砝码重量 int[] m = new int[n]; // 砝码数量 int[] x = new int[n]; for(int i=0; i<n; i++){ m[i] = in.nextInt(); } // 总重量 int sum = 0; for(int i=0; i<n; i++){ x[i] = in.nextInt(); sum += m[i]*x[i]; } // dp[i]表示砝码能否组成重量i boolean[] dp = new boolean[sum+1]; dp[0] = true; for(int i=0; i<n; i++){ for(int j=1; j<=x[i]; j++){ // 降序 for(int k=sum; k>=m[i]; k--){ if(dp[k-m[i]]){ dp[k] = true; } } } } int kind = 0; for(int i=0; i<=sum; i++){ if(dp[i]){ kind++; } } System.out.println(kind); } }