描述
对于给定的 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。
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;
}
}