题解 | #称砝码#

理解别人的代码后加入一些注释,方便自己理解。

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();
    }
}


全部评论

相关推荐

点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务