【较难】算法nodeJs:数组分组

31 阅读1分钟

描述

对于给定的 n 个整数 a1​,a2​,…,an​,将其分为 a,b 两个数组,满足:

∙所有 5 的倍数元素均在 a 数组中;
∙所有 3 的倍数元素(不包括 5 的倍数)均在 b 数组中;
∙其他元素可以任意分配。
求解是否存在一种分配方案,使得 a 数组中各个元素之和等于 b 数组中各个元素之和。每一个元素要么在 a 数组中,要么在 b 数组中;数组可以为空,此时和为 0。如果存在这样的方案,输出 true,否则输出 false。

输入描述:

第一行输入一个整数 n(1≦n≦50) 代表给定的整数个数。
第二行输入 n 个整数 a1​,a2​,…,an​(−500≦ai​≦500)。

输出描述:

如果存在满足条件的分配方案,输出 true,否则输出 false。

image.png

const readline = require("readline");
const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout,
});
let k = 0;
let n = 0;
let nums = [];
rl.on("line", function (line) {
    if (k === 0) {
        n = Number(line);
        k++;
    } else {
        nums = line.split(" ").map((e) => Number(e));
        getArr();
    }
});

function getArr() {
    let multi5 = [];
    let multi3 = [];
    let others = [];
    for (let i = 0; i < nums.length; i++) {
        if (nums[i] % 3 === 0 && nums[i] % 5 !== 0) {
            multi3.push(nums[i]);
        } else if (nums[i] % 5 === 0) {
            multi5.push(nums[i]);
        } else {
            others.push(nums[i]);
        }
    }
    let sum5 =
        multi5.length > 0
            ? multi5.reduce((prev, current) => prev + current)
            : 0;
    let sum3 =
        multi3.length > 0
            ? multi3.reduce((prev, current) => prev + current)
            : 0;
    console.log(isExists(sum5, sum3, others, 0));
}

function isExists(sum5, sum3, others, index) {
    if (others.length === 0 && sum5 !== sum3) {
        return false;
    } else if (others.length === 0 && sum5 === sum3) {
        return true;
    } else if (others.length === index && sum5 !== sum3) {
        return false;
    } else if (others.length === index && sum5 === sum3) {
        return true;
    } else if (index < others.length) {
        return (
            isExists(sum5 + others[index], sum3, others, index + 1) ||
            isExists(sum5, sum3 + others[index], others, index + 1)
        );
    } else {
        return false;
    }
}