計算複雑性理論における計算の難しさの議論の対象となる問題のひとつ。
容量 C のナップサックが一つと、n 個の品物(各々、価値 pi, 容積 ci)が与えられたとき、ナップサックの容量 C を超えない範囲でいくつかの品物をナップサックに詰め、ナップサックに入れた品物の価値の和を最大化する問題。NP困難であることが知られている。全ての品物について pi=ci が成り立つとき、部分和問題と等価であるため、この問題を含んでいる。
はじめに 定期テストに向けて、Karp's Reduction の流れに沿って、諸々の問題の NP 完全性を示すことができるように勉強する必要が生じた。 ここでは、ナップサック問題が弱 NP 完全問題であることを、Partition が弱 NP 完全問題であることを利用して、証明する。 Partition について Partition における入力は、 個の要素からなる整数集合 である。 出力すべきは、 ある で、 \begin{equation} \sum_{i \in X} a_i = \sum_{i \not \in X} a_i \end{equation} を満たす X は存在するか…
数学の具体的な問題にPythonを使って、数学もPythonも同時に学んでしまいましょう。今回はPythonを使った確率・統計の問題として、ナップサック問題をみてみたいと思います。重量と価値の決まった品物をナップサックに詰める問題ですが、ナップサックには重量制限があり、制限を満たすなかで詰め込んだ品物の価値を最大化するのはどのような組み合わせか?という問題で、実用上も面白い問題です。ここでは重量に制限があるとしましたが、容量と読み替えても同じですし、あるいは問題をより複雑にするためには、重量と容量の両方に制限を設けて考察することもできるでしょう。今回は問題を簡単にするために重量のみについて制限…
はじめに 動的計画法 ナップサック問題 例題 考え方 実装例 おわりに 参考 はじめに こんにちは.talosです.今回はナップサック問題を例題に,動的計画法を説明します.競技プログラミングとかでもよく使われるので,これから挑戦しようという人は必見です. 動的計画法 動的計画法(DP:Dynamic Programming)は問題を部分問題に分割し,それらを解くことで最終的な解を求める方法です.似たような方法に分割統治法がありますが,これとの違いは部分問題を解いた結果を保存しておくことです.これによって,分割統治法でよくある同じ部分問題を何度も解いてしまうということを避けることができます.言葉…
ランレングス圧縮をする問題に一瞬見えるかもしれない。でもそんなことしないで、最初から最後まで綺麗に DP で殴れる! 問題へのリンク 問題概要 文字 'a' と 'A' のみからなる長さ の文字列 が与えられる。 以下のキーボード操作を繰り返すことで、この文字列 を画面に打ち込みたい。そのための最小コストを求めよ。 なお、CapsLock が ON の状態と OFF の状態とがあって、初期状態では OFF であるとする。 操作 1 (a キーを押す):コスト OFF のときは、文字 'a' が入力される ON のときは、文字 'A' が入力される 操作 2 (Shift + a キーを押す):…
はじめに こんにちは,株式会社Ridge-iエンジニアの中村です.本記事では量子アニーリング手法を用いた最適化についてご紹介します. 量子アニーリングでは,イジングモデルという統計力学の理論モデルを用いて最適化計算を行うため,通常の数理モデルの定式化からQUBOと呼ばれる式へ変換する必要があります.私自身QUBOについてはあまり知らなかったため,これを機に調べてみました.またスケジュールタスクに量子アニーリングを適用した論文 "Applying Quantum Annealing for Shift Scheduling Problem for Call Centers" の問題設定を模擬して…
軽い気持ちで始めたらとんでもないことになった。 計算時間の求め方 計算時間の表し方 O記法について (前述のO記法に対して)これらはどのようなアルゴリズムで使われるの?step by stepで解説して アルゴリズムのオーダー記法を図で説明できる? O記法について教えて。小学生にもわかるように。 n lon nを題材にO記法の例について教えて。中学生にもわかるように。 計算時間の求め方 計算時間は、アルゴリズムが実行されるステップ数で評価されます。 1ステップは計算の基本単位です。 アルゴリズムが終了するまでに実行される基本単位の回数を計算時間として考えます。 計算時間の表し方 計算時間は、以…
深さ優先探索(Depth-First Search) ある状態からはじめて、遷移できなくなるまで状態を進める。遷移できなくなったら1つ前の状態に戻る。上記はstackのpushとpopで実現できる。このため、深さ優先探索は再帰関数(呼び出し元に戻る)で実装できる場合が多い。 部分和問題(Partial Sum) {a1, a2, ..., an}からいくつか選んだ和がkになるかを判別する。今回は深さ優先探索で各組み合わせの和をすべて求める。a1から順に和に加えないor加えるを決める。このため、以下のような二分木に対して、深さ優先探索を行えば良い。 public class PartialSum…
動的計画法とは、ある問題を複数の小さな問題に分割し、それぞれの問題を解決することで、全体の問題を解決する方法です。動的計画法は、複雑な問題を解決するために使用される一般的なアルゴリズムであり、コンピュータサイエンスや数学、経済学などの分野で広く使用されています。 動的計画法は、1950年代にリチャード・ベルマンによって考案されました。当初、彼は航空機の制御問題に取り組んでいたため、この手法は最適制御問題に対する解法として発展していきました。その後、他の最適化問題にも応用され、現在では幅広い分野で使用されています。 動的計画法は、以下の3つのステップで構成されます。 最適化問題を小さな部分問題に…
init_mathjax = function() { if (window.MathJax) { // MathJax loaded MathJax.Hub.Config({ TeX: { equationNumbers: { autoNumber: "AMS", useLabelIds: true } }, tex2jax: { inlineMath: [ ['$','$'], ["\\(","\\)"] ], displayMath: [ ['$$','$$'], ["\\[","\\]"] ], processEscapes: true, processEnvironments: tr…
Python言語によるプログラミングイントロダクション 第3版―計算モデリングとデータサイエンスの応用とともに 「Python言語によるプログラミングイントロダクション 第3版―計算モデリングとデータサイエンスの応用とともに」内容紹介 「Python言語によるプログラミングイントロダクション 第3版―計算モデリングとデータサイエンスの応用とともに」目次 「Python言語によるプログラミングイントロダクション 第3版―計算モデリングとデータサイエンスの応用とともに」Amazonでの購入はこちら 「Python言語によるプログラミングイントロダクション 第3版―計算モデリングとデータサイエンスの…
はじめに この記事について 最近暇なので、アルゴリズムの勉強でもしようかと思い、ネットで見かけた「アルゴ式」というプログラミング学習サービスを使って、アルゴリズムの基礎を学んでいます。始めてから1ヶ月ほど経ったので感想などをまとめておきます。 アルゴ式とは algo-method.com 主にアルゴリズムを学ぶための無料で利用できるプログラミング学習サービスです。 アルゴ式の特徴は以下で、 C++, Python をメインにしているが複数の言語から好きな言語を選択できる 他人の解答が見られる 解説(解答例付き)を読める 時間制限がない 2023/2/9 時点で 20 以上のセクション、800 …
問題はこちら 目次 問題概要 解説 提出プログラム 感想 問題概要曜日からなる一週間の各曜日に「平日」か「休日」のどちらかを割り当てる.このとき,曜日の生産量は以下のように表される. 曜日が「休日」である場合は 曜日が「平日」のとき,直前の休日が日前,直後の休日が日後である場合は 一週間当たりの生産量の最大値を求めよ. 解説曜日の前日は曜日,というように前後に繋がっているので「平日」「休日」の割り当てを決めた際にrotateをしても答えは変わりません.つまり,曜日は必ず休日としてもよいです.次に,初日が休日で,その後平日が続くようなブロックに分解してみます.休日日+平日日の全日からなるブロック…
コンテストページ:AtCoder Beginner Contest 285 - AtCoder コンテスト中AC:A〜D コンテスト後自力AC:E,F D - Change Usernames E - Work or Rest F - Substring of Sorted String D - Change Usernames ユーザ名の重複を取り除き、番号を振り直したものをとします。 からに、からに変更することを考えます。 配列の途中に要素を挿入する場合に末尾要素から順に後ろにずらしてスペースを作りますが、同じように、をに変更してからをに変更すれば、2つの変更を達成できます。 達成できない…
たまにはと思って、Dから解いてみた 6完 59:19 + 1ペナで86位、こどふぉ勢がいないので順位は高いけど立ち回りがびみょい A Edge Checker 2 ある程度慣れてる人ならAなんだけど、グラフ初見の人はたいへんそう 二分木なので親が子/2か?で判定できる (AC 20:48) B Longest Uncommon Prefix SiがS[1~i]かと思ってあせるけど、そんなものBに出るわけないのでよくみるとS[i]だった 内容としては愚直にチェックすればOK (AC 24:09) C abc285_brutmhyhiizp 逆の操作はABC-Cで既出 26進法だと思って計算すれば…
AtCoder Beginner Contest 285に参加しました。 ※いつもと違って日曜日に開催なので翌日の仕事に影響しないようにいつも以上に簡潔に考察の整理 結果 A,B,C,Dの4問正解でした。D問題がいつもより早く解けた気がする。 A - Edge Checker 2 配列で2分木を作るときに親子関係がどうなっているかを知っていればすぐに解ける問題。 子の番号は親の番号2と親の番号2+1になるのでa,bの関係がこれに当てはまるかどうかを判定する。 B - Longest Uncommon Prefix 問題文を読んでもいまいち何をすればいいかわからなかった問題。 入力例とその解説を…
こんばんは。 したいこと無限大な年末です。 DP 今日はDPの勉強をしていました。 動的計画法といって、あるものを求めたいときにそれまでの過程を全て求めることで早く計算できる、みたいな感じのものです。 わかりやすい例としてはフィボナッチ数列の計算があります。 例1.普通に計算する場合 1番目:1 2番目:1 3番目:1+1=2 4番目:1+(1+1)=3 5番目:(1+1)+(1+(1+1))=5 こんな感じになりますが 例2.DPを使う場合 準備:計算結果を格納する配列を用意する それぞれの計算後、毎回結果を格納することで、過去の結果を再利用できる 1番目:1 2番目:1 3番目:1番目+2…
gihyo.jp Software Design 2023年1月号を読んでのメモ。 ハピネスチームビルディング 第10回 「技術記事の投稿をサポートしてアウトプットを習慣づける」 小島優介さんの連載。最近はご無沙汰なものの過去2社で自社ブログを書いていたことがあり、この記事で取り上げられていたような悩みには心当たりがあります。 成長するための1つの施策として、みんなで技術記事を毎月書くことにトライしてみようとなったものの、メンバーは記事投稿に対して高いハードルを感じていました。それは「書こうと思ったことと同じ内容の記事がすでに世の中にあるので、書くネタがない」ということでした(ちなみにその後、…