编辑代码

// 设置标准输入接口
const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;

void (async function () {
  // 读取数组长度
  const n = Number(await readline());

  // 读取数组并转换为数字
  const arr = (await readline()).split(" ").map(Number);

  // 计算数组总和
  let sum = arr.reduce((a, b) => a + b);

  // 如果总和为奇数,无法平分,直接返回-1
  if (sum % 2 !== 0) return console.log(-1);

  // 目标和为总和的一半
  const bag = sum / 2;

  // dp[i]表示和为i时需要的最少数字个数
  const dp = Array(bag + 1).fill(Infinity);
  dp[0] = 0; // 和为0时不需要任何数字

  // 对每个数字进行处理
  for (const num of arr) {
    // 从大到小遍历可能的和
    for (let i = bag; i >= num; i--) {
      // 如果当前和减去num后的状态可达
      if (dp[i - num] !== Infinity) {
        // 更新最小数字个数
        dp[i] = Math.min(dp[i], dp[i - num] + 1);
      }
    }
  }

  // 如果目标和不可达,输出-1;否则输出最少数字个数
  console.log(dp[bag] === Infinity ? -1 : dp[bag]);
})();