提出 #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 | ||||
| 結果 |
|
|
| セット名 | テストケース |
|---|---|
| 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 |