编辑代码

// 设置标准输入接口
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