Upgrade to Pro — share decks privately, control downloads, hide ads and more …

DPを使ったナップザック問題の解き方/Solve knapsack problem with DP

d kura
November 29, 2022

DPを使ったナップザック問題の解き方/Solve knapsack problem with DP

d kura

November 29, 2022
Tweet

Other Decks in Programming

Transcript

  1. DP(動的計画法)を使った
    ナップザック問題の解き方
    情報科学科 1年
    倉持大樹
    1

    View Slide

  2. DP(動的計画法)とは?
    • 数学の漸化式のように解くアルゴリズム
    • 全探索で行うと時間がかかりすぎる問題に使う
    2

    View Slide

  3. DPの実践(ナップザック問題)
    問題
    N個の品物があり、各品物に重さと価値が決まっている。
    これらの品物からいくつかを重さの総和がWを超えない
    ように選んだときの、価値の総和の最大値を求めよ。

    N=3
    (重さ,価値)=(2,3),(1,4),(3,6)
    W=3
    ⇒7 ( (2,3),(1,4)を選んだとき )
    3

    View Slide

  4. 他の解法(ナップザック問題)
    各品物について選ぶ、選ばないを決める
    →全パターンの重さ、価値の合計を出す
    →重さがW以下の中での価値の最大値を見つける
    品物 (2,3) (1,4) (3,6) 重さ 価値
    〇 〇 〇 6 13
    〇 〇 × 3 7
    〇 × 〇 5 9
    〇 × × 2 3
    × 〇 〇 4 10
    × 〇 × 1 4
    × × 〇 3 6
    × × × 0 0 4

    View Slide

  5. DPの考え方(ナップザック問題)
    考える範囲
    ⇒一度に全体を考えるとわかりずらい
    5

    View Slide

  6. DPの考え方(ナップザック問題)
    𝑥𝑖
    =i番目まででの価値の最大値
    考える範囲
    ⇒考える範囲を増やしていく
    6

    View Slide

  7. DPの考え方(ナップザック問題)
    →重さの情報がないため 𝑥𝑖
    を 𝑥𝑖−1
    から
    求められない
    ⇒・添え字の数を2つに増やす
    ・増やした添え字に重さの情報を入れる
    𝑥𝑖
    =i番目まででの価値の最大値
    𝑥𝑖,𝑤
    =i番目までで重さがw以下の価値の最大値
    7

    View Slide

  8. DPの考え方(ナップザック問題)
    𝑥𝑖,𝑤
    =i番目までで重さがw以下の価値の最大値
    i\w 0 1 2 3
    0
    1
    2
    3
    表の右下の数字は
    3番目までで重さが3以下の価値の最大値
    8

    View Slide

  9. DPの考え方(ナップザック問題)
    𝑥𝑖,𝑤
    = i番目までで重さがw以下の価値の最大値
    i\w 0 1 2 3
    0
    1
    2
    3
    1. i=0の行を埋める⇒一つも候補がない
    9

    View Slide

  10. DPの考え方(ナップザック問題)
    𝑥𝑖,𝑤
    = i番目までで重さがw以下の価値の最大値
    i\w 0 1 2 3
    0 0 0 0 0
    1
    2
    3
    1. i=0の行を埋める⇒一つも候補がない
    10

    View Slide

  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番目を選ぶ)
    ※w-2列が存在しないときは(ⅰ)のみ
    11

    View Slide

  12. 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

    View Slide

  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番目を選ぶ)
    13

    View Slide

  14. 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

    View Slide

  15. 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

    View Slide

  16. 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

    View Slide

  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
    3. 2番目の品物(1,4)を選ぶが決め、i=2の行を埋める
    17

    View Slide

  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
    4. 3番目の品物(3,6)を選ぶが決め、i=3の行を埋める
    18

    View Slide

  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
    4. 3番目の品物(3,6)を選ぶが決め、i=3の行を埋める
    19

    View Slide

  20. 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

    View Slide

  21. DPの実践(ナップザック問題)
    1. 漸化式の添え字の数を決める
    2. 漸化式を決定する
    3. 初期値を決定する
    解法の手順
    21

    View Slide

  22. DPの実践(ナップザック問題)
    ⇒添え字は i と w の2つ
    i…何番目の品物まで考えるか
    w…重さはいくつ以下とするか
    1. 漸化式の添え字の数を決める
    22

    View Slide

  23. DPの実践(ナップザック問題)
    i番目の品物の重さ・価値 ⇒ 𝑤𝑖
    ・𝑣𝑖
    とすると
    𝑥𝑖,𝑤
    = ൝
    max(𝑥𝑖−1,𝑤−𝑤𝑖
    +𝑣𝑖
    , 𝑥𝑖−1,𝑤
    )
    𝑥𝑖−1,𝑤
    𝑤 ≥ 𝑤𝑖
    𝑤 < 𝑤𝑖
    (ⅰ) 一つ上の行にある数 (i番目を選ばない)
    (ⅱ) 一つ上の行のw-𝑤𝑖
    列にある数+𝑣𝑖
    (i番目を選ぶ)
    2. 漸化式の決定
    漸化式
    23

    View Slide

  24. DPの実践(ナップザック問題)
    3. 初期値の決定
    𝑥𝑖,𝑤
    = 0 0 ≤ 𝑤 ≤ 𝑊
    ⇒表のi=0の行をすべて0で埋めた
    i\w 0 1 2 3
    0 0 0 0 0
    1
    24

    View Slide

  25. 最後に
    • 𝑂(2𝑁) → 𝑂(𝑁𝑊)まで短縮できた
    • このほかの2つDPを使う問題のパターンに
    取り組みたい
    • ナップザック問題をより発展させた問題に
    取り組みたい
    25

    View Slide