Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
DPを使ったナップザック問題の解き方/Solve knapsack problem with DP
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
d kura
November 29, 2022
Programming
0
520
DPを使ったナップザック問題の解き方/Solve knapsack problem with DP
d kura
November 29, 2022
Tweet
Share
Other Decks in Programming
See All in Programming
CSC307 Lecture 02
javiergs
PRO
1
770
副作用をどこに置くか問題:オブジェクト指向で整理する設計判断ツリー
koxya
1
590
IFSによる形状設計/デモシーンの魅力 @ 慶應大学SFC
gam0022
1
290
OCaml 5でモダンな並列プログラミングを Enjoyしよう!
haochenx
0
120
15年続くIoTサービスのSREエンジニアが挑む分散トレーシング導入
melonps
2
170
今から始めるClaude Code超入門
448jp
7
8.3k
CSC307 Lecture 09
javiergs
PRO
1
830
AI時代の認知負荷との向き合い方
optfit
0
140
メルカリのリーダビリティチームが取り組む、AI時代のスケーラブルな品質文化
cloverrose
2
510
Lambda のコードストレージ容量に気をつけましょう
tattwan718
0
100
Patterns of Patterns
denyspoltorak
0
1.4k
Rust 製のコードエディタ “Zed” を使ってみた
nearme_tech
PRO
0
140
Featured
See All Featured
Design in an AI World
tapps
0
140
Large-scale JavaScript Application Architecture
addyosmani
515
110k
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
580
WCS-LA-2024
lcolladotor
0
440
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
287
14k
The untapped power of vector embeddings
frankvandijk
1
1.6k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
22k
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
450
The Curious Case for Waylosing
cassininazir
0
230
For a Future-Friendly Web
brad_frost
182
10k
The Illustrated Children's Guide to Kubernetes
chrisshort
51
51k
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
110
Transcript
DP(動的計画法)を使った ナップザック問題の解き方 情報科学科 1年 倉持大樹 1
DP(動的計画法)とは? • 数学の漸化式のように解くアルゴリズム • 全探索で行うと時間がかかりすぎる問題に使う 2
DPの実践(ナップザック問題) 問題 N個の品物があり、各品物に重さと価値が決まっている。 これらの品物からいくつかを重さの総和がWを超えない ように選んだときの、価値の総和の最大値を求めよ。 例 N=3 (重さ,価値)=(2,3),(1,4),(3,6) W=3 ⇒7
( (2,3),(1,4)を選んだとき ) 3
他の解法(ナップザック問題) 各品物について選ぶ、選ばないを決める →全パターンの重さ、価値の合計を出す →重さがW以下の中での価値の最大値を見つける 品物 (2,3) (1,4) (3,6) 重さ 価値
〇 〇 〇 6 13 〇 〇 × 3 7 〇 × 〇 5 9 〇 × × 2 3 × 〇 〇 4 10 × 〇 × 1 4 × × 〇 3 6 × × × 0 0 4
DPの考え方(ナップザック問題) 考える範囲 ⇒一度に全体を考えるとわかりずらい 5
DPの考え方(ナップザック問題) 𝑥𝑖 =i番目まででの価値の最大値 考える範囲 ⇒考える範囲を増やしていく 6
DPの考え方(ナップザック問題) →重さの情報がないため 𝑥𝑖 を 𝑥𝑖−1 から 求められない ⇒・添え字の数を2つに増やす ・増やした添え字に重さの情報を入れる 𝑥𝑖
=i番目まででの価値の最大値 𝑥𝑖,𝑤 =i番目までで重さがw以下の価値の最大値 7
DPの考え方(ナップザック問題) 𝑥𝑖,𝑤 =i番目までで重さがw以下の価値の最大値 i\w 0 1 2 3 0 1
2 3 表の右下の数字は 3番目までで重さが3以下の価値の最大値 8
DPの考え方(ナップザック問題) 𝑥𝑖,𝑤 = i番目までで重さがw以下の価値の最大値 i\w 0 1 2 3 0
1 2 3 1. i=0の行を埋める⇒一つも候補がない 9
DPの考え方(ナップザック問題) 𝑥𝑖,𝑤 = i番目までで重さがw以下の価値の最大値 i\w 0 1 2 3 0
0 0 0 0 1 2 3 1. i=0の行を埋める⇒一つも候補がない 10
DPの考え方(ナップザック問題) 𝑥𝑖,𝑤 = i番目までで重さがw以下の価値の最大値 i\w 0 1 2 3 0
0 0 0 0 1 2 3 2. 1番目の品物(2,3)を選ぶが決め、i=1の行を埋める マスに入る数の候補は (ⅰ) 一つ上の行にある数 (1番目を選ばない) (ⅱ) 一つ上の行のw-2列にある数+3 (1番目を選ぶ) ※w-2列が存在しないときは(ⅰ)のみ 11
DPの考え方(ナップザック問題) 𝑥𝑖,𝑤 = i番目までで重さがw以下の価値の最大値 i\w 0 1 2 3 0
0 0 0 0 1 2 3 2. 1番目の品物(2,3)を選ぶが決め、i=1の行を埋める (ⅰ) 一つ上の行にある数 (1番目を選ばない) (ⅱ) 一つ上の行のw-2列にある数+3 (1番目を選ぶ) 12
DPの考え方(ナップザック問題) 𝑥𝑖,𝑤 = i番目までで重さがw以下の価値の最大値 i\w 0 1 2 3 0
0 0 0 0 1 0 0 2 3 2. 1番目の品物(2,3)を選ぶが決め、i=1の行を埋める (ⅰ) 一つ上の行にある数 (1番目を選ばない) (ⅱ) 一つ上の行のw-2列にある数+3 (1番目を選ぶ) 13
DPの考え方(ナップザック問題) 𝑥𝑖,𝑤 = i番目までで重さがw以下の価値の最大値 i\w 0 1 2 3 0
0 0 0 0 1 0 0 2 3 2. 1番目の品物(2,3)を選ぶが決め、i=1の行を埋める (ⅰ) 一つ上の行にある数 (1番目を選ばない) (ⅱ) 一つ上の行のw-2列にある数+3 (1番目を選ぶ) 14
DPの考え方(ナップザック問題) 𝑥𝑖,𝑤 = i番目までで重さがw以下の価値の最大値 i\w 0 1 2 3 0
0 0 0 0 1 0 0 3 3 2 3 2. 1番目の品物(2,3)を選ぶが決め、i=1の行を埋める (ⅰ) 一つ上の行にある数 (1番目を選ばない) (ⅱ) 一つ上の行のw-2列にある数+3 (1番目を選ぶ) 15
DPの考え方(ナップザック問題) 𝑥𝑖,𝑤 = i番目までで重さがw以下の価値の最大値 i\w 0 1 2 3 0
0 0 0 0 1 0 0 3 3 2 3 3. 2番目の品物(1,4)を選ぶが決め、i=2の行を埋める 16
DPの考え方(ナップザック問題) 𝑥𝑖,𝑤 = i番目までで重さがw以下の価値の最大値 i\w 0 1 2 3 0
0 0 0 0 1 0 0 3 3 2 0 4 4 7 3 3. 2番目の品物(1,4)を選ぶが決め、i=2の行を埋める 17
DPの考え方(ナップザック問題) 𝑥𝑖,𝑤 = i番目までで重さがw以下の価値の最大値 i\w 0 1 2 3 0
0 0 0 0 1 0 0 3 3 2 0 4 4 7 3 4. 3番目の品物(3,6)を選ぶが決め、i=3の行を埋める 18
DPの考え方(ナップザック問題) 𝑥𝑖,𝑤 = i番目までで重さがw以下の価値の最大値 i\w 0 1 2 3 0
0 0 0 0 1 0 0 3 3 2 0 4 4 7 3 0 4 4 7 4. 3番目の品物(3,6)を選ぶが決め、i=3の行を埋める 19
DPの考え方(ナップザック問題) 𝑥𝑖,𝑤 = i番目までで重さがw以下の価値の最大値 i\w 0 1 2 3 0
0 0 0 0 1 0 0 3 3 2 0 4 4 7 3 0 4 4 7 5. 表の1番右下のマスの値が答え 20
DPの実践(ナップザック問題) 1. 漸化式の添え字の数を決める 2. 漸化式を決定する 3. 初期値を決定する 解法の手順 21
DPの実践(ナップザック問題) ⇒添え字は i と w の2つ i…何番目の品物まで考えるか w…重さはいくつ以下とするか 1. 漸化式の添え字の数を決める
22
DPの実践(ナップザック問題) i番目の品物の重さ・価値 ⇒ 𝑤𝑖 ・𝑣𝑖 とすると 𝑥𝑖,𝑤 = ൝ max(𝑥𝑖−1,𝑤−𝑤𝑖
+𝑣𝑖 , 𝑥𝑖−1,𝑤 ) 𝑥𝑖−1,𝑤 𝑤 ≥ 𝑤𝑖 𝑤 < 𝑤𝑖 (ⅰ) 一つ上の行にある数 (i番目を選ばない) (ⅱ) 一つ上の行のw-𝑤𝑖 列にある数+𝑣𝑖 (i番目を選ぶ) 2. 漸化式の決定 漸化式 23
DPの実践(ナップザック問題) 3. 初期値の決定 𝑥𝑖,𝑤 = 0 0 ≤ 𝑤 ≤
𝑊 ⇒表のi=0の行をすべて0で埋めた i\w 0 1 2 3 0 0 0 0 0 1 24
最後に • 𝑂(2𝑁) → 𝑂(𝑁𝑊)まで短縮できた • このほかの2つDPを使う問題のパターンに 取り組みたい • ナップザック問題をより発展させた問題に
取り組みたい 25