JSで動的計画法を利用して部分和問題を解く
2022-02-207 min read
目次
概要
動的計画法を利用して部分和問題を計算した際のメモです。(AtCoder用)
動的計画法
動的計画法について
↓
部分和
部分和問題について
↓
ソース
動的計画法を行う関数
function solve(data, num) {
const dp = Array.from(
new Array(data.length + 1),
() => new Array(num + 1).fill(0),
);
for (let col = 0; col < data.length; col++) {
for (let row = 0; row < num + 1; row++) {
if (row < data[col]) {
dp[col + 1][row] = dp[col][row];
} else {
dp[col + 1][row] = Math.max(
dp[col][row],
dp[col][row - data[col]] + data[col],
);
}
}
}
return dp[data.length][num] === num;
}
利用方法は以下です。
// [問題]
// 問: [3, 7, 8, 12, 13, 18] の部分和が 27 になる部分集合を求めよ。
// 答: 存在する。[7, 8, 12]
const arr = [3, 7, 8, 12, 13, 18];
console.log(solve(arr, 27) ? '存在する' : '存在しない');
おまけ: TypeScript用
TypeScript用のソースです。
const solve = (data: Array<number>, num: number) => {
const dp = Array.from(
new Array(data.length + 1),
() => new Array(num + 1).fill(0),
);
for (let col = 0; col < data.length; col++) {
for (let row = 0; row < num + 1; row++) {
if (row < data[col]) {
dp[col + 1][row] = dp[col][row];
} else {
dp[col + 1][row] = Math.max(
dp[col][row],
dp[col][row - data[col]] + data[col],
);
}
}
}
return dp[data.length][num] === num;
};
Recommends
New Posts
Hot posts!
Date
Tags
(110)
(54)
(54)
(47)
(45)
(36)
(30)
(29)
(24)
(24)
(22)
(21)
(21)
(20)
(19)
(17)
(16)
(16)
(15)
(14)
(12)
(12)
(12)
(12)
(12)
(12)
(11)
(10)
(10)
(10)
(10)
(10)
(9)
(9)
(8)
(8)
(8)
(8)
(7)
(7)
(6)
(6)
(6)
(6)
(6)
(5)
(5)
(5)
(5)
(4)
Author