1. 基本例: w=[3,4,5], v=[4,5,6], cap=7 -> 9
  2. 1 品目だけ取る: w=[1,3,4,5], v=[1,4,5,7], cap=7 -> 9
  3. 全部取れる: w=[1,2,3], v=[6,10,12], cap=10 -> 28
  4. 1 つも取れない: w=[5,10], v=[10,20], cap=4 -> 0
  5. 容量 0: w=[1,2], v=[3,4], cap=0 -> 0
  6. 重い高価値の選択: w=[2,3,4,5], v=[3,4,5,6], cap=5 -> 7
コース一覧
コンピューターサイエンス:アルゴリズム / OS / ネットワーク / DB
0/1 ナップサック問題

コンピューターサイエンス:アルゴリズム / OS / ネットワーク / DB

ソート、探索、再帰などのアルゴリズムに加え、OS (プロセス、メモリ、ファイルシステム)、ネットワーク (TCP/IP、HTTP、DNS、CDN)、データベースまで、Web エンジニアに必要な CS の基礎を一本で学べる総合コースです。エンジニア転職を目指す学習者や、CS 出身でない現役エンジニアを対象としています。約 34 時間 (1 日 30 分 × 68 日) で 135 レッスンを修了でき、修了後は技術選定やシステム設計の議論に自信を持って参加できるようになります。

1
再帰の基礎
01. 階乗(再帰)5分
02. フィボナッチ数(再帰)5分
03. 累乗(再帰)5分
04. 配列の合計(再帰)5分
05. 桁数を数える(再帰)5分
06. 文字列を逆順(再帰)5分
07. ユークリッドの互除法(GCD)5分
08. 第1章まとめクイズ — 再帰の基礎5分
2
第2章 探索
01. 線形探索で位置を返す5分
02. 二分探索 (反復版)5分
03. 二分探索 (再帰版)5分
04. lower_bound (最初に >= target の位置)5分
05. ピーク要素検索5分
06. 回転ソート配列での探索5分
07. 第2章まとめクイズ5分
3
ソート
01. バブルソート実装5分
02. 選択ソート5分
03. 挿入ソート5分
04. マージソート5分
05. クイックソート5分
06. カウントソート5分
07. 比較関数つきソート5分
08. 第3章まとめクイズ5分
4
配列 / 文字列の応用
01. 双方向ポインタで和 = K5分
02. スライド窓の最大和5分
03. 回文判定5分
04. 重複なし最長部分文字列5分
05. 大きな数の文字列乗算5分
06. アナグラムグルーピング5分
07. 第4章まとめクイズ — 配列 / 文字列の応用5分
5
クラスと OOP
01. 長方形クラス(面積と周長)5分
02. スタッククラス(push と pop)5分
03. キュークラス(enqueue と dequeue)5分
04. 単方向リンクリスト5分
05. 二分探索木 (BST) への挿入5分
06. カウンタクラス(機能合成)5分
07. 第 5 章クイズ — クラスと OOP5分
6
動的計画法 (基礎)
01. メモ化フィボナッチ5分
02. DP配列でフィボナッチ5分
03. 階段の登り方5分
04. コイン両替最小枚数5分
05. 0/1 ナップサック問題5分
06. 最長共通部分列 (LCS)5分
07. 第6章まとめクイズ5分
7
総合演習
01. ソート済み 2 配列のマージ5分
02. 配列の k 回転5分
03. カッコの妥当性5分
04. ローマ数字を整数に5分
05. 整数をローマ数字に5分
06. 雨水を溜める5分
07. 最終総まとめクイズ5分
8
[OS] Section 1. OS とは
01. コンピューターとOSの役割15分
02. OSの歴史(バッチ→マルチタスク→マルチユーザー)15分
03. カーネルとユーザーランド15分
04. システムコールの仕組み15分
05. Linux / macOS / Windows のアーキ比較15分
9
[OS] Section 2. プロセスとスレッド
01. プロセスとは15分
02. スレッドとプロセスの違い15分
03. コンテキストスイッチ15分
04. スケジューラとアルゴリズム15分
05. プロセス間通信(IPC)15分
10
[OS] Section 3. メモリ管理
01. メモリ階層(レジスタ→キャッシュ→RAM→ディスク)15分
02. 仮想メモリ15分
03. ページングとスワップ15分
04. mmap とメモリマップトファイル15分
05. ガベージコレクション概要15分
11
[OS] Section 4. ファイルシステム
01. ファイルシステムとは15分
02. i-node とディレクトリ15分
03. ext4 / APFS / NTFS の違い15分
04. ジャーナリングと耐障害性15分
05. パーミッションと所有者15分
12
[OS] Section 5. 同期と並行性
01. レースコンディション15分
02. Mutex と Semaphore15分
03. デッドロック15分
04. 非同期と並行15分
05. イベントループと epoll15分
13
[ネットワーク] ネットワークの全体像
01. ネットワークとは8分
02. OSI 7階層モデル10分
03. TCP/IP 4階層モデル9分
04. パケットとフレーム9分
05. ルーター・スイッチ・ハブ9分
14
[ネットワーク] IP とルーティング
01. IPアドレス (IPv4 / IPv6)10分
02. サブネットマスクと CIDR11分
03. NAT とプライベートIP9分
04. ルーティングと経路選択10分
05. ファイアウォール基礎9分
15
[ネットワーク] TCP / UDP
01. TCP と UDP の違い9分
02. 3-way ハンドシェイク9分
03. 輻輳制御と再送10分
04. UDP の用途 (DNS / 動画 / ゲーム)8分
05. ポート番号と well-known port9分
16
[ネットワーク] HTTP / HTTPS
01. HTTP の基本10分
02. HTTP メソッド9分
03. HTTPS と TLS ハンドシェイク10分
04. HTTP/2 と HTTP/3 (QUIC)10分
05. REST API の設計原則10分
17
[ネットワーク] DNS とドメイン
01. DNS とは8分
02. レコードタイプ10分
03. 名前解決の流れ10分
04. DNS キャッシュと TTL9分
05. CDN の仕組みと Anycast10分
18
[ネットワーク] 応用
01. ロードバランサ (L4 / L7)10分
02. プロキシとリバースプロキシ9分
03. WebSocket とリアルタイム通信9分
04. gRPC と HTTP/2 利用10分
19
[データベース] データベースの基礎
01. データベースとは8分
02. RDB と NoSQL の違い8分
03. データベースの歴史8分
04. エンティティ関係モデル (ER)8分
05. 主キー・外部キー・候補キー8分
20
[データベース] 正規化
01. 正規化とは何か8分
02. 第1正規形8分
03. 第2正規形8分
04. 第3正規形8分
05. 非正規化のトレードオフ8分
21
[データベース] インデックスと B-tree
01. インデックスの役割8分
02. B-tree の仕組み8分
03. B+tree(実際の DB 実装)8分
04. ハッシュインデックス8分
05. カバリングインデックス8分
22
[データベース] トランザクションと ACID
01. トランザクションとは8分
02. ACID 特性8分
03. 分離レベル8分
04. MVCC(マルチバージョン同時実行制御)8分
05. デッドロックと回避8分
23
[データベース] クエリ最適化
01. クエリプランナの役割8分
02. EXPLAIN の読み方8分
03. Nested Loop / Hash / Merge Join8分
04. インデックスチューニング8分
05. 統計情報とカーディナリティ8分
24
[データベース] スケーリング
01. レプリケーション8分
02. シャーディング8分
03. CAP 定理8分
04. 結果整合性8分
05. NewSQL と分散 SQL8分

0/1 ナップサック問題

容量の決まったリュックに品物を詰めます。品物にはそれぞれ重さと価値があり、同じ品物は 1 個しか入れられません。合計の重さが容量を超えない範囲で、価値の合計を最大にするのが目標です。

価値の高い順に詰めると、9 になるはずが 6 で終わる

重さと価値が (3, 4)、(4, 5)、(5, 6) の 3 個、容量が 7 だとします。価値の高い順に詰めると、まず (5, 6) が入って残り容量は 2。もう何も入らず、価値は 6 で終わりです。実際には (3, 4) と (4, 5) を入れれば重さちょうど 7、価値は 9 になります。

前回のコイン両替と似た失敗ですが、事情が 1 つ増えています。コインは同じ額面を何枚でも使えましたが、今回は各品物が 1 個限りです。「その品物をまだ使っていないか」を覚えていないと、同じものを二重に数えてしまいます。

覚えることが 2 つある

コイン両替では、金額さえ決まれば最小枚数が決まりました。今回は、残り容量が同じでも、そこまでにどの品物を使ったかで答えが変わります。そこで覚える状態を 2 つにします。何個目までの品物を検討したか、そして容量がいくつか、の 2 つです。

品物を 1 個ずつ検討し、それぞれについて取るか取らないかを決めます。取らなければ、価値は 1 個前まで検討したときと同じです。取るなら、その品物の重さぶんだけ容量を空けた状態での価値に、その品物の価値を足します。大きいほうを残します。

表を 1 マスずつ埋める

重さと価値が (2, 3)、(3, 4)、(4, 6) の 3 個、容量 5 で埋めてみます。行が「何個目まで検討したか」、列が「容量」です。

検討した品物012345
なし000000
(2, 3) まで003333
(3, 4) まで003447
(4, 6) まで003467

3 行目の容量 5 のマスを見てください。(3, 4) を取らなければ、真上の 3 がそのまま入ります。取るなら、重さ 3 を空けた容量 2 の 1 行上のマスが 3 なので、そこへ価値 4 を足して 7。大きいほうの 7 が入ります。

どのマスも、見に行く先は 1 行上だけです。上の行から順に、左から右へ埋めていけば、参照先は必ず埋まっています。欲しい答えは右下のマスです。

Python で表を作るときは、行の作り方に落とし穴があります。

Python

dp = [[0] * 6] * 4 # 4 行が同じ 1 本を指してしまう dp[1][2] = 3 print(dp[0][2]) # 3 になる dp = [[0] * 6 for _ in range(4)] # こちらが正しい

掛け算で行を増やすと、同じリストへの参照が 4 つ並ぶだけです。1 行書き換えると全行が変わります。

やってみよう

knapsack(weights, values, capacity) を書いてください。行が品物の個数、列が容量の表を用意し、上の行から順に埋めます。i 行目が担当するのは i 番目の品物ですが、配列の添字は 0 から始まるので、対応する重さは weights[i - 1] です。このずれが最も多い間違いです。最後に右下のマスを返します。

要件

  1. 各品物は最大 1 個までしか取らない (0/1 ナップサック)
  2. dp[i][w] を「i 個まで考えたときに容量 w で実現できる最大価値」と定義し、2 次元配列を埋める
  3. 遷移は dp[i][w] = max(dp[i-1][w], dp[i-1][w - wi] + vi) (w >= wi のとき)

入出力例

knapsack([3,4,5], [4,5,6], 7) → 9 knapsack([1,3,4,5], [1,4,5,7], 7) → 9 knapsack([1,2,3], [6,10,12], 10) → 28 knapsack([5,10], [10,20], 4) → 0 knapsack([1,2], [3,4], 0) → 0 knapsack([2,3,4,5], [3,4,5,6], 5) → 7

ヒント

サイズ (n+1) x (capacity+1) の 2 次元配列を 0 で初期化する。Python では [[0]*X for _ in range(Y)] の書き方を使う

i 番目の品物の重さは weights[i-1]、価値は values[i-1]。インデックスのずれに注意

「取らない」値で初期化してから、w >= weights[i-1] のときだけ「取る」値と比較して大きい方を採用する

生田 陸人
監修生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
編集 ゆめさく編集部·公開 2026/05/19·更新 2026/08/26

関連レッスン

  • 最長共通部分列 (LCS)

    2 つの文字列の最長共通部分列 (LCS) の長さを 2 次元 DP で求める。文字列系 DP の典型として diff や DNA 解析の土台を学ぶ。

  • 第6章まとめクイズ

    動的計画法の基礎 (メモ化・配列 DP・コイン両替・ナップサック・LCS) の理解を 1 問で確かめる。

  • ソート済み 2 配列のマージ

    2 つの `ソート済み配列` を 1 本のソート済み配列にマージする `双方向ポインタ` の典型題を実装する。

  • コンピューターとOSの役割

    OS がハードウェアを抽象化しアプリと利用者の橋渡しをする役割を、資源管理と抽象化という二つの軸で初学者にも分かるように整理します。

main.py
学習モード
エディタを読み込んでいます

メモ

0/1 ナップサック問題

⌘S で保存