编辑代码

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

void (async function () {
  // 读取文件数量n
  const n = Number(await readline());

  // 计算软盘最大容量(单位:块)
  // 1474560字节 = 1.44MB(软盘容量)
  // 512字节 = 一个块的大小
  // maxSize表示软盘最多可以存储多少个块
  const maxSize = 1474560 / 512;

  // 存储每个文件的大小(单位:字节)
  let sizes = [];
  for (let i = 0; i < n; i++) {
    sizes.push(Number(await readline()));
  }

  // 创建dp数组,dp[i]表示容量为i个块时能存储的最大字节数
  // dp数组初始化为0
  const dp = Array.from({ length: maxSize + 1 }, () => 0);

  // 01背包问题:遍历每个文件
  for (const size of sizes) {
    // 计算当前文件需要占用的块数
    // 使用Math.ceil向上取整,因为即使文件不足一个块,也要占用一个完整的块
    const weight = Math.ceil(size / 512);

    // 从最大容量开始反向遍历
    // 反向遍历是为了避免同一个文件被重复使用
    for (let i = maxSize; i >= weight; i--) {
      // dp[i]表示当前容量下的最大存储字节数
      // dp[i - weight] + size 表示放入当前文件后的总字节数
      // 取两者的最大值
      dp[i] = Math.max(
        dp[i], // 不放入当前文件
        dp[i - weight] + size // 放入当前文件
      );
    }
  }

  // 输出最大容量下能存储的最大字节数
  console.log(dp[maxSize]);
})();