提出 #67502555


ソースコード 拡げる

const fs = require('fs');

/**
 * 与えられたカードの数列から、合計Sとなる部分集合が存在するか判定し、
 * 存在する場合はカードのインデックスを1つ返す。
 * @returns {void}
 */
function main() {
  const input = fs.readFileSync('/dev/stdin', 'utf8').trim().split(/\s+/).map(Number);

  const N = input[0];        // カードの枚数
  const S = input[1];        // 目標の合計
  const A = input.slice(2);  // 各カードに書かれた値(長さN)

  /** 
   * dp[s] = [i, prevSum] : 合計sは、カードi(0-indexed)を使って、prevSumから作った
   * @type {Map<number, [number, number]>}
   */
  const dp = new Map();
  dp.set(0, null);  // 合計0は何も使わずに作れる

  for (let i = 0; i < N; i++) {
    const nextDp = new Map(dp);  // 現在の状態をコピー

    for (const [s, val] of dp.entries()) {
      const newSum = s + A[i];
      if (newSum <= S && !nextDp.has(newSum)) {
        nextDp.set(newSum, [i, s]);  // s+A[i] は カードi で作った
      }
    }

    // 更新
    for (const [key, val] of nextDp.entries()) {
      dp.set(key, val);
    }
  }

  // 合計Sを作れるかチェック
  if (!dp.has(S)) {
    console.log(-1);
    return;
  }

  // 経路復元
  /** @type {number[]} */
  const result = [];
  let currSum = S;

  while (currSum !== 0) {
    const [i, prevSum] = dp.get(currSum);
    result.push(i + 1);  // 1-indexed に変換
    currSum = prevSum;
  }

  result.reverse();
  console.log(result.length);
  console.log(result.join(' '));
}

main();

提出情報

提出日時
問題 B18 - Subset Sum with Restoration
ユーザ myoshizumi
言語 JavaScript (Node.js 18.16.1)
得点 1000
コード長 1645 Byte
結果 AC
実行時間 105 ms
メモリ 59856 KiB

ジャッジ結果

セット名 Sample All
得点 / 配点 0 / 0 1000 / 1000
結果
AC × 3
AC × 21
セット名 テストケース
Sample sample_01.txt, sample_02.txt, sample_03.txt
All large_01.txt, large_02.txt, large_03.txt, large_04.txt, large_05.txt, max_01.txt, max_02.txt, max_03.txt, sample_01.txt, sample_02.txt, sample_03.txt, small_01.txt, small_02.txt, small_03.txt, small_04.txt, small_05.txt, small_06.txt, small_07.txt, small_08.txt, small_09.txt, small_10.txt
ケース名 結果 実行時間 メモリ
large_01.txt AC 105 ms 51408 KiB
large_02.txt AC 77 ms 58480 KiB
large_03.txt AC 42 ms 42776 KiB
large_04.txt AC 42 ms 43500 KiB
large_05.txt AC 89 ms 59856 KiB
max_01.txt AC 41 ms 42816 KiB
max_02.txt AC 41 ms 42880 KiB
max_03.txt AC 44 ms 43956 KiB
sample_01.txt AC 43 ms 42748 KiB
sample_02.txt AC 43 ms 42832 KiB
sample_03.txt AC 42 ms 43092 KiB
small_01.txt AC 43 ms 42792 KiB
small_02.txt AC 42 ms 42888 KiB
small_03.txt AC 41 ms 42836 KiB
small_04.txt AC 40 ms 42804 KiB
small_05.txt AC 41 ms 42756 KiB
small_06.txt AC 42 ms 42804 KiB
small_07.txt AC 42 ms 42668 KiB
small_08.txt AC 43 ms 42628 KiB
small_09.txt AC 41 ms 42804 KiB
small_10.txt AC 41 ms 42828 KiB