题解 | #数组分组#

数组分组

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

import java.util.Scanner;
import java.util.*;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
/**
非常好理解的算法
利用回溯算法
sum = mod5(5的整倍数的和) + mod3(3的整倍数的和) + other(其他数的和)
target = sum/2
整理出来这些变量之后,接下来只要遍历other 在other列表里找到一个组合 使得
other + mod5 == target
或者
other + mod3 == target 即可
 */
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        int n = in.nextInt();

        int sum = 0;
        int mod3 = 0;
        int mod5 = 0;
        ArrayList<Integer> other = new ArrayList<>();
        while (in.hasNextInt()) {
            // 注意 while 处理多个 case
            n = in.nextInt();
            if (n % 5 == 0) {
                mod5 += n;
            } else if (n % 3 == 0) {
                mod3 += n;
            } else {
                other.add(n);
            }
            sum += n;
        }

        if (sum % 2 != 0) {
            System.out.println(false);
        } else {
            System.out.println(trav(mod3, mod5, sum / 2, other, new boolean[other.size()],
                                    0, 0));
        }
    }

    // 回溯法
    private static boolean trav(int mod3, int mod5, int target,
                                ArrayList<Integer> nums, boolean[] used, int idx, int sum) {
        if (sum + mod3 == target) return true;
        if (sum + mod5 == target) return true;

        for (int i = idx; i < nums.size(); i++) {
            if (used[i] == false) {
                used[i] = true;
                if (trav(mod3, mod5, target, nums, used, i + 1, sum + nums.get(i))) {
                    return true;
                }
                used[i] = false;
            }
        }
        return false;
    }
}

全部评论

相关推荐

点赞 评论 收藏
分享
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务