計算複雑性理論における計算の難しさの議論の対象となる問題のひとつ。
容量 C のナップサックが一つと、n 個の品物(各々、価値 pi, 容積 ci)が与えられたとき、ナップサックの容量 C を超えない範囲でいくつかの品物をナップサックに詰め、ナップサックに入れた品物の価値の和を最大化する問題。NP困難であることが知られている。全ての品物について pi=ci が成り立つとき、部分和問題と等価であるため、この問題を含んでいる。
どれを持ち帰る?冒険者が旅の途中、たくさんの宝物を見つけました。 しかし、持ち帰れるのは8kgまでです。 持ち帰る宝物の価値が最も高くなるには、どれを持ち帰ればいいのか。 それを知るべく我々はアマゾンの奥地「動的計画法」の奥地へ向かった・・・。 ナップサック問題を考える bit全探索 実装 動的計画法 実装 メモ化再帰 ループ ループ(一次元配列メモ) 選択した要素の取得 →その①「フィボナッチ数列」 →その③「部分和問題」 ナップサック問題を考える 冒頭に挙げたような問題は「ナップサック問題」と呼ばれる。 組合せ最適化問題の一つだ。問題を解くには、各要素を選ぶor選ばないの二択で考えていく。…
はじめに 定期テストに向けて、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)は問題を部分問題に分割し,それらを解くことで最終的な解を求める方法です.似たような方法に分割統治法がありますが,これとの違いは部分問題を解いた結果を保存しておくことです.これによって,分割統治法でよくある同じ部分問題を何度も解いてしまうということを避けることができます.言葉…
この記事は ノバセル Advent Calendar 23日目です。 こんにちは。 ノバセルにてデータサイエンティストをしています、石川ナディーム(@nadeemishikawa)です。 数理最適化とは、制約条件のもとで目的関数を最大化または最小化する手法です。ビジネス上のさまざまな課題(生産計画、輸送計画、プライシングなど)や、機械学習モデルのハイパーパラメータ調整など、幅広い分野で用いられています。 Pythonで、数理最適化を扱うためのライブラリとしてオープンソースのPuLPがあります。本記事では、PuLPのインストール方法から、簡単な例としてナップサック問題を解く一連の流れをサクッと解…
こんにちは、「カミナシ 従業員」開発チームの a2 (@Atsuhiro_tim) です。 re:Invent については、弊社含め多くの企業のセッションレポートを目にしていることと思います。 re:Invent は新サービス発表のある基調講演や、実際に手を動かしてサービスを触れるセッションへの参加などがメインコンテンツですが、ラスベガスに一週間滞在する間、それらが全てではありません。異国に行くこと自体や、セッション以外にも面白いアクティビティなどがあります。 今回は、そういったセッション以外の側面にスポットを当ててみたいと思います。ゆるい記事なので、すきま時間に読んでいただければと思います。…
こんにちは.T.鈴木です.ひさしぶりに記事を書くので,いろいろ温かい目で見守って下さい. この記事は,Tonevo Advent Calender 5日目の記事です.記事ポータルはこちら↓ tonevoadventcalendar.hatenablog.com ほかの方の魅力的な記事もぜひご覧ください. 前日の記事はこちら↓ tonevoadventcalendar.hatenablog.com 音ゲーマーのアドカレなので音ゲーの話をするんですが,私も修士2年になってしまったので,自身の専門であるアルゴリズム論に少し関連した記事内容にしたいと思います. ところで皆さん,チュウニズムやSOUND…
10になるカードの組み合わせはある?数字の書かれたカードが並んでいる。 この中から好きなカードを選び、書かれた数字の合計が10になる組み合わせは存在するか? このような「部分和問題」を「動的計画法」を使って効率よく解く方法を考える。 部分和問題を考える 実装 ループ ビットDP →②ナップサック問題 部分和問題を考える 部分和問題はナップサック問題の一種として考えることができる。 ナップサック問題では要素(荷物)に 重さ 価値 という二つの属性があったが、部分和問題では「重さ=価値」として扱える。また、動的計画法にて計算をメモする場合、通常のナップサック問題では memo[i][j] = v …
全探索では解けないような難しい問題を解くのに欠かせない「動的計画法」について考える。 動的計画法とは 「フィボナッチ数列」の計算 愚直な計算 動的計画法を使う計算 実装 Non-DP DP(メモ化再帰) DP(ループ) →②「ナップサック問題」 動的計画法とは そもそも動的計画法が何なのかをざっくり言うと、 「計算結果をメモしながら解くと、効率よく問題を解ける」 という、問題を解くための指針である。「それのどこが動的で計画なのよ?」と思うだろう。 正直、名前だけではイメージは付きにくい。 動的は「その時に決まる」という意味であり、 「その時その時に計画する」というのはもはや無計画に見える。"D…
これらは数学とアルゴリズムに関連した問題で、複雑な状況で最適な解を見つけるための技法です。中学生でも理解しやすいように、それぞれ簡単に説明していきます。 動的計画法(Dynamic Programming) 動的計画法は、大きな問題をいくつかの小さな部分問題に分けて、それぞれの答えを計算してから全体の解を求める方法です。 例: フィボナッチ数列を考えてみましょう。次の数字が前の2つの数字の合計になるように並んでいます(例: 1, 1, 2, 3, 5, 8, …)。普通に計算するよりも、すでに計算した値を使うと、計算が速くなります。これが動的計画法の考え方です。 連続最適化問題(Continu…
ナップサック問題。鉄則本の問題なのでコードのみ。 問題へのリンク 問題概要 宝箱には 個の品物が入っている。品物 の重さは 、価値は である。 太郎君は、いくつかの品物を選んで持ち帰りたいと考えている。しかし、彼のナップザックには容量制限があるので、重さの合計が 以下になるようにする必要がある。 価値の合計としてあり得る最大の値はいくつか。 制約 コード #include <bits/stdc++.h> using namespace std; int main() { int N, W; cin >> N >> W; vector<long long> w(N), v(N); for (in…
お疲れさまでした~ ABCDの80分4完でした(ノーペナ) Cもっと速く解けただろ感あるので辛いですね。 A-369 問題要約 方針 B-Piano 3 問題要約 方針 C-Count Arithmetic Subarrays 問題要約 方針 余談 D-Bonus EXP 問題要約 方針 余談 A-369 問題要約 そのまま 方針 A=Bなら1、|A-B|が奇数なら2、偶数なら3 B-Piano 3 問題要約 そのまま 方針 LとRが最初にある場所に高橋君の手を置いておくのが最適戦略 C-Count Arithmetic Subarrays 問題要約 連続した部分数列が等差数列となるものは何個…
日本レジストリサービス(JPRS)プログラミングコンテスト2024#2(AtCoder Beginner Contest 364)に参加しました。 結果 A,B,Cの3問正解でした。 D問題もE問題も解けそうで解ききれなかった。 制約ギリギリの入力があった時とかにTLEになって、最後まで解消できなかった。悔しい。 A - Glutton Takahashi sweetかsaltyかが入力される。sweetが2回連続で入力された場合、次の入力を受け取れないこととする。 最後まで入力が受け取れるかどうかを答える問題。 最後2回がsweetの場合はYesになるのを気をつければ、あとは指示通りの判定を…
部分和問題・ナップサック問題とほとんど同じ DP で解ける! 問題へのリンク 問題概要 数直線上で座標 0 から出発して、 回のジャンプをする。 回目のジャンプでは、正の方向に または の移動をする。 回のジャンプの末に座標 に到達することが可能かどうか判定せよ。 制約 解法 部分和問題とほとんど同様に解ける! 部分和問題については次の記事を参照。 qiita.com この記事の「部分和問題」と同様の DP で解ける。次の配列を考えよう。 dp[i][x] ← 最初から 回のジャンプによって、座標 に到達することが可能かどうかを表すブール値 このとき、DP の更新式は次のように表せる。 x -…
TL;DR 楽しかった! 本編 おはようございます。手札事故(twitter:@hand_accident)と申します。 Ruby知識ゼロから初参加したRubyKaigi 2024レポート、略してルゼロ*1という感じでやっていきたいと思います。 < Day 0 自己紹介でもしとくか。生まれ育った愛媛県松山市*2に帰って非IT企業でパソコン係をやっている過程で、すべてが個人開発の労働環境で趣味全ブッパ技術選定をした結果HaskellとNimを書くようになりました。すこしSvelteもします。 Rubyは名前を聞いたことがあるしちょっとニッチなPythonライブラリ探そうとしたら時々検索にgemが…
問題 No.417 チューリップバブル - yukicoder 解法 この解法は 木上のナップサック問題 #アルゴリズム - Qiita の「応用」で言及されているものと全く同じだと思います。↓でご指摘いただきました。 参考文献の応用のところに同じことが言及されていませんか? 詳細は書かれてないので記事自体は価値があると思います— 熨斗袋 (@noshi91) 2024年5月24日 制約付きのナップサック問題への言い換え まず各街 $i$ について 重量:親側の辺 $e$ の長さ $C _ e$ 価値:税収 $U _ i$ で定まる荷物が与えられれれて、 重量の合計が $M / 2$ 以下であ…
基本情報技術者試験を受けて多分(?)受かりました。僕は過去問を周回したりする、いわゆる試験勉強みたいなのが苦手です。 なので僕みたいな怠惰な人が日頃からダラダラ本を読むことで過去問をあまり解かずに受かる方法を残しておこうと思います。どちらかというと、普段ダラダラ読んでる本の中から試験に役立つ本をリストアップするというのが正しいかもしれません。目次 自己紹介 基本情報技術者試験 試験範囲について 勉強方法について 受験 おわり! 自己紹介 都内某所でプログラマとして働いています。 数年前までAtCoderをやっていました。 会社ではAWSのインフラ色々いじったり、PHPの異常レガシーコードをしば…
MC Digital プログラミングコンテスト2024(AtCoder Heuristic Contest 031)に参加したので、問題を解いた過程を記録してみた。 問題 サンプルをベタ移植 すべての予約を縦割りで割り当てる しばらくコスト算出の実装に精を出す コストについて考えた イベントスペースを長方形のセクションに分割する セクションの分け方を実験した 複数ナップサック問題? 余裕のあるところに詰めてもらう(雑実装の解消) システムテスト やりたかったこと 問題 atcoder.jp W x W のグリッドで表現されるイベントホールがある D 日分の予約群があり、日毎に N 件の予約があ…