题解 | #数组分组# dfs递归,借鉴大佬,注释详尽

数组分组

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

import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (sc.hasNext()) {
            //数据个数
            int n = Integer.parseInt(sc.nextLine());
            int sum3 = 0;//3的倍数的和
            int sum5 = 0;//5的倍数的和
            int sumAll = 0;//总和
            //存放非3非5倍数的数
            List<Integer> list = new ArrayList<>();
            //数据
            for (int i = 0; i < n; i++) {
                int temp = sc.nextInt();
                //优先5的倍数
                if (temp % 5 == 0) {
                    sum5 += temp;
                } else if (temp % 3 == 0) {
                    sum3 += temp;
                } else {
                    list.add(temp);
                }
                sumAll += temp;
            }

            //如果总和不是2的倍数,不可能分为两个相等的数组
            if (sumAll % 2 != 0) {
                System.out.println("false");
            } else {
                //sum3 + sum5 + list = sumAll
                //sumAll/2 = sum5 + list1  = sum3 + list2
                //list = list1 + list2
                int target = sumAll / 2 - sum5;
                System.out.println(dfs(list,target,0));
            }
        }
    }

    //dfs寻找target
    public static boolean dfs(List<Integer> list, int target, int start) {
        //终止条件 target=0表示已经从list中取到一些值的和为target
        //如果已经遍历到list最后一个值,还没有将target归零,则返回false;不进入else中的start+1,会造成越界异常
        if (start == list.size()) {
            return target==0;
        }
        else {
            //递归,用当前值能算出来或用下一个值能算出来
            return dfs(list, target - list.get(start), start + 1) || dfs(list,target,start+1);
        }
    }
}

全部评论

相关推荐

昨天 14:15
门头沟学院 Java
点赞 评论 收藏
分享
06-17 21:57
门头沟学院 Java
白友:噗嗤,我发现有些人事就爱发这些,明明已读不回就行了,就是要恶心人
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务