そのほかのケースも見てみます。存在しないケースがあります。なってしまい収束しません。$$まとめ今回は、アルゴリズムの評価方法でもある計算量についてまとめてみました。した知識しかなかったのですが、ちゃんと数学的に定義されているのを初めて知って理解が深まったような気がします。日頃なんとなく使っている知識の背景を知ることも重要だなと思いました。(世界標準MIT教科書)この記事をシェア関連記事2019年8月11日ナップサック問題をメモ化を使って解くこんにちは、kz_moritaです。今回は、前回の続きです。前回作成したプログラムをメモ化という方法で高速化してみます。前回と同様ナップサックにアイテムを入れるかどうかの木構造を考えたときに、以下のようになったと仮定します。なっていることがわかります。これらのノードの下に続くノードたちは全く一緒のものになります。ここは片方で計算し終えていれば再度計算する必要はありません。よってこのノードの以下の計算結果をメモしておいて再利用することができます。それでは早速計算結果をメモする実装を行なっていきます。返すように修正します。再帰的に見ていく子ノードのアイテムを入れるorいれないについて、計算結果の大きい方をメモしていきます。それでは以下にソースコードを記載します。(items.2019年8月4日ナップサック問題を解くこんにちは、kz_moritaです。最近競技プログラミングを再度やり始めて悪戦苦闘しています。本記事では、ナップサック問題を実際に解いてみます。今回の対象となるナップサック問題ですが、Wikipediaにはこう書かれています。超えない範囲でいくつかの品物をナップサックに詰め、ナップサックに入れた品物の価値の和を最大化するにはどの品物を選べばよいか」という整数計画問題である。要するに、特定の容量が決まっているナップサックにお宝を目一杯詰めたい時に、お宝の価値が最大になる組み合わせを求めるっていう問題ですね。出来るだけ価値が高いお宝を詰めたいけども、あまり容量の大きな物を入れると数が入らなくなってしまうというトレードオフをうまいこと求めようというものです。それでは、まずは普通に解いてみます。今回の例として以下のような条件で考えてみます。ナップサック問題を解くにあたり、以下のような木構造を考えます。Itemをナップサックに入れるか入れないか、という分岐を木構造で表現してみます。(4つの数字と四則演算を用いて10をつくるゲーム。解くプログラムを作ろうとして、その1要素としてC++で逆ポーランド記法を計算するプログラムを書いてみたら楽しかったのでメモしておきます。2ならば、12+の用に書きます。コンピュータで計算式を解析するのに向いている記法で、演算子を後置するようなイメージです。ような例をつかって計算順序のイメージをみてみます。左から順番に文字を処理していき以下のような順序で演算していきます。詳しい説明はこちらのサイトがすごくわかりやすいので、ぜひ参照してみてください。環境は以下の通りです。c++14の記法を一部使っています。今回はユニットテスト用にgoogleTestを使用することにしました。Testに関しては参考になったサイトを載せておくのでそちらを参照していただければと思います。