• 实现:
  • 先将重量和数量 展开得到一个所有砝码的List;
  • 使用set对所有砝码可能的和去重;
  • 每新增一个砝码,循坏所有的和与心砝码求和。 再加入set中。
import java.util.Scanner;
import java.util.List;
import java.util.ArrayList;
import java.util.Set;
import java.util.HashSet;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNext()) { // 注意 while 处理多个 case
            int n = in.nextInt();
            int[] weight = new int[n];
            int[] nums = new int[n] ;

            for (int i = 0; i < n; i++) weight[i] = in.nextInt();
            for (int i = 0; i < n; i++) nums[i] = in.nextInt();

            // 所有砝码重量list
            List<Integer> weights = new ArrayList<>();
            for (int i = 0; i < n; i++) {
                int w = weight[i];
                int count = nums[i];
                while (count > 0) {
                    weights.add(w);
                    count--;
                }
            }

            Set<Integer> set = new HashSet<>();
            set.add(0);

            for (int i = 0; i < weights.size(); i++) {
                // 临时存"和"的地方
                List<Integer> tempSum = new ArrayList<>();

                // set 中的每个元素  和当前元素求和
                for (Integer integer : set) tempSum.add(integer + weights.get(i));

                // 所有的和 放入
                set.addAll(tempSum);

                // list
                tempSum.clear();
            }

            // for (Integer integer : set) {
            //     System.out.print(integer + " ");
            // }

            System.out.println(set.size());
        }
    }
}