题解 | #数组分组#

数组分组

https://www.nowcoder.com/practice/9af744a3517440508dbeb297020aca86

import java.util.Scanner;
import java.util.List;
import java.util.ArrayList;

public class Main {
    private static boolean result = false;
    private static int sum = 0;

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int sumA = 0;
        List<Integer> nums = new ArrayList<>();
        // 设全部数字的和为sum
        // 设左边数组的数字和为sumA,输入数据的时候顺便将5的倍数都计入sumA;
        // 只有非5的倍数会加到列表nums中
        for (int i = 0; i < n; i++) {
            int num = in.nextInt();
            sum += num;
            if (num % 5 == 0) {
                sumA += num;
            } else {
                nums.add(num);
            }
        }
        check(nums, 0, sumA);
        System.out.println(result);
    }

    private static void check(List<Integer> nums, int idx, int sumA) {
        // 若result为true,则不需要继续递归了(剪枝)
        // 若所有数字和为左边数组的和的两倍,则符合条件,将结果result设为true
        if (result || sum == sumA * 2) {
            result = true;
            return;
        }

        if (idx == nums.size()) {
            return;
        }

        // 当前数字不加入左边数组的情况
        check(nums, idx + 1, sumA);

        // 当前数字不为3的倍数,加入左边数组的情况
        if (nums.get(idx) % 3 != 0) {
            check(nums, idx + 1, sumA + nums.get(idx));
        }
    }
}

全部评论

相关推荐

10-13 17:47
门头沟学院 Java
wulala.god:图一那个善我面过,老板网上找的题库面的
点赞 评论 收藏
分享
喜欢走神的孤勇者练习时长两年半:池是池,发是发,我曾池,我现黑
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
11-20 19:57
已编辑
某大厂 golang工程师 23.0k*16.0, 2k房补,年终大概率能拿到
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务