// 设置标准输入接口
const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;
// 问题描述:将一个数组平均分成两部分,使得两部分的和的差值最小
// 输入格式:一行空格分隔的整数
// 输出格式:两部分和的最小差值
void (async function () {
// 读取输入数组并排序
const arr = (await readline())
.split(" ")
.map(Number)
.sort((a, b) => a - b); // 排序有助于优化搜索过程
// 记录找到的最小差值,初始化为无穷大
let ans = Infinity;
// 深度优先搜索函数
// 参数说明:
// idx: 当前考虑的数组索引
// level: 当前已选择的数字个数
// subSum: 当前已选择数字的和
// totalSum: 整个数组的总和
const dfs = (idx, level, subSum, totalSum) => {
// 终止条件:已经选择了一半的数字
if (level == arr.length / 2) {
// 计算两部分的差值
// totalSum - subSum 是另一半的和
// 使用 Math.abs(totalSum - 2 * subSum) 计算差值
ans = Math.min(ans, Math.abs(totalSum - 2 * subSum));
return;
}
// 从当前位置开始尝试选择数字
for (let i = idx; i < arr.length; i++) {
// 递归调用,选择当前数字
// i + 1: 下一个要考虑的位置
// level + 1: 已选择数字数量加1
// subSum + arr[i]: 已选择数字的和加上当前数字
// totalSum: 总和保持不变
dfs(i + 1, level + 1, subSum + arr[i], totalSum);
}
};
// 调用深度优先搜索
// 初始参数:
// 0: 从第一个数字开始
// 0: 已选择0个数字
// 0: 已选择数字的和为0
// arr.reduce(): 计算整个数组的总和
dfs(
0,
0,
0,
arr.reduce((a, b) => a + b, 0)
);
// 输出最小差值
console.log(ans);
})();
// 示例说明:
// 输入:2 4 5 6 8 3
// 输出:0
// 解释:
// 1. 数组排序后:[2,3,4,5,6,8]
// 2. 可以分成 [2,3,8] 和 [4,5,6]
// 3. 两部分的和都是13,差值为0