うさぎでもわかるアルゴリズム 動的計画法
ナップサック問題(ナップサックもんだい、Knapsack problem)は、計算複雑性理論における計算の難しさの議論の対象となる問題の一つで、「容量 \( C \) のナップサックが一つと、\( n \) 種類の品物(各々、価値 \( p_i \), 容積 \( c_i \))が与えられたとき、ナップサックの容量 \( C \) を超えない範囲でいくつかの品物をナップサックに詰め、ナップサックに入れた品物の価値の和を最大化するにはどの品物を選べばよいか」という整数計画問題である。
[引用元:ナップサック問題-wikipedia]
(2) ナップサック問題にチャレンジ!問題 寿司屋の食べ放題
- 縦が数字の個数 \( n \)
- 横が0から限界カロリー \( l \) までの限界カロリー
- 表に埋めるのはカロリーの最大値ではなく、金額の最大値(求めたいのはそれぞれの限界kcal以内で食べれる寿司の最大金額なため)
- 5つの寿司ともカロリーが10kcal単位なので、表に埋めるのも10kcal単位にする(計算ステップ数が1/10になるので10倍早く結果が出せる)
- 縦が商品の個数分(\( n \) 個)
- 横が0からカロリー \( l \) までの \( l+1 \) 個
そのため、処理ステップ数は部分和問題と同じく\[n(l+1) = nl + n\]となり、\( nl + n \) ステップ数と求められます。
よって、計算量をオーダーで表すと \( O(nl) \) となります。
(空間計算量も、表を記憶する分だけかかると考えてもらえたらOKです! 今回の場合は \( O(nl) \) となります。)
5.さいごに
- 一定金額以内なら食べ放題のとき、どんなメニューで頼めばちょうどの金額で食べられるか
- ある商品の中から何品か選んだときにちょうど1,000円となるような組み合わせは何通りあるか
*1 : 導出の際には差分方程式を解きます。実際に、\[a_ = a_ + a_, \ \ a_ = 0, \ \ a_ = 1\]の漸化式(差分方程式)を解くと、\[a_n = \frac < \sqrt> \left( \left( \frac < 2 >\right)^ - \left( \frac < 2 >\right)^ \right)\]となるので、大きい項である\[\frac < \sqrt> \left( \frac < 2 >\right)^\]を取ることでオーダーが求められます。もし差分方程式の解き方に興味がある人はこちらの記事を御覧ください。
公開日: 2020年5月25日 更新日: 2022年11月15日 この記事を書いた人 コメント一覧 コメントはありません。 関連記事 うさぎでもわかる線形代数 第11羽 線形写像(前編) 線形写像の判定・表現行列 【∀, ∃がある式の読み方】うさぎでもわかる離散数学 第3羽 述語論理のいろは うさぎでもわかる計算機システム(基本情報対応) Part19 仮想記憶とページング(4GBの壁の正体は?) 【2021共通テスト】確率分布と統計的な推測 うさぎでもわかる解説 基本情報対策 うさぎでもわかるセキュリティ 前編 うさぎでもわかる信号処理・制御工学 第11羽 フーリエ変換 【基本情報対策】うさぎでもわかるソフトウェア工学 Part08 UML後編(シーケンス図・ユースケース図・アクティビティ図) うさぎでもわかるオートマトンと言語理論 第06羽 Myhill-Nerodeの定理・正則でない言語の証明法 うさぎでもわかる線形代数 補充3 平面の方程式 うさぎでもわかるε-δ論法・ε-N論法カテゴリー
各種便利ツール・問い合わせ- 【完全無料】離散数学演習ツール・計算機まとめ
- 【ハッセ図】上界/下界・最大元/最小元・極大元/極小元・上限(最小上界)/下限(最大下界) 判定ツール
- 【ハッセ図】述語論理(∀・∃)真偽判定ツール
- 【離散数学】べき集合 2^A・P(A) 自動計算&全列挙ツール
- 【離散数学】真理値表 自動作成ツール(途中式あり)
- 【離散数学】集合の「∈・⊆」真偽チェッカー(答え合わせ用)
- 【離散数学テスト対策】真理値表の穴埋めガチ演習ツール
- 【離散数学テスト対策】集合の「∈・⊆」ガチ演習! 弱点分析つき○×ドリル
目次
- 1.動的計画法とは
- 動的計画法のイメージ
- (1) 動的計画法を使わない場合(再帰法)
- ソースコード(再帰法)
- ソースコード(メモ化再帰)
- ソースコード(動的計画法によるフィボナッチ数列の計算)
- (1) とりあえず全探索
- ソースコード(全探索)
- 処理の流れ
- C言語
- Python
- (1) ナップサック問題とは
- (2) ナップサック問題にチャレンジ!
- (3) ナップサック問題のソースコード
- C言語
- Python
工業大学生ももやまのうさぎ塾 (Momousagi Academy)
コンピュータグラフィックス コンピュータビジョン- 1.動的計画法とは
- 動的計画法のイメージ
- (1) 動的計画法を使わない場合(再帰法)
- ソースコード(再帰法)
- ソースコード(メモ化再帰)
- ソースコード(動的計画法によるフィボナッチ数列の計算)
- (1) とりあえず全探索
- ソースコード(全探索)
- 処理の流れ
- C言語
- Python
- (1) ナップサック問題とは
- (2) ナップサック問題にチャレンジ!
- (3) ナップサック問題のソースコード
- C言語
- Python