JSで動的計画法を利用して部分和問題を解く
約 3 分
目次
概要
動的計画法を利用して部分和問題を計算した際のメモです。(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;
};おすすめの記事
最新の記事
よく読まれている記事
タグから探す
- javascript129
- typescript66
- node.js54
- linux54
- 画像処理48
- amazon-aws47
- アルゴリズム37
- canvas35
- html529
- 画像処理100本ノック27
- php24
- centos24
- python22
- 競技プログラミング21
- mac21
- mysql20
- opencv17
- 雑談16
- 機械学習16
- docker16
- wordpress15
- atcoder14
- apache12
- データベース12
- amazon-s312
- red-hat12
- prisma12
- ubuntu11
- github10
- git10
- react10
- mariadb10
- vue.js9
- aws-cdk9
- css38
- 可視化8
- 小ネタ8
- next.js8
- nestjs8
- amazon-lightsail7
- ブログ6
- cms6
- oracle6
- perl6
- gitlab6
- iam5
- amazon-ec25
- 資格試験5
- aws-amplify5
- curl4