Algorithm Deep Dive
343億通りの組み合わせを40万通りに削減し、1秒で最適解を見つけるアルゴリズムの解説。
35件の配当金データから、合計が目標金額(7,240,268円)を超えない範囲で、最大限その金額に近づける組み合わせを見つける。
全件合計は7,331,370円で、目標を91,102円超過している。どの項目を除外すべきか?
35件のデータがあるとき、各項目は「計上する」か「しない」かの2択。
1秒に100万通り処理できるとしても、約9.5時間かかる。
「全部を一度に処理する」のではなく、「半分ずつ処理して組み合わせる」という発想。
343億通り → 40万通り = 約87,000倍の高速化
35件のデータを前半17件・後半18件に分ける
前半グループで作れる全ての合計値、後半グループで作れる全ての合計値をそれぞれ計算
前半の各合計に対して、「後半から足しても目標を超えない最大値」を高速に検索
| 件数 | 全探索 | Meet-in-Middle | 高速化倍率 |
|---|---|---|---|
| 20件 | 100万 | 2,048 | 512倍 |
| 30件 | 10億 | 65,536 | 16,384倍 |
| 35件 | 343億 | 393,216 | 87,381倍 |
| 40件 | 1兆 | 約200万 | 524,288倍 |
前半の各合計に対して、「後半から足しても100を超えない最大値」を探す。
合計100(前半30 + 後半70、または前半65 + 後半35)
Step 3で「条件を満たす最大値」を探すとき、後半の合計リストをソートしておけば二分探索で一瞬で見つかる。
35件の配当金データを前半17件・後半18件に分割。前半で約13万通り、後半で約26万通りの部分和を計算し、二分探索で最適な組み合わせを特定。処理時間は約1秒(全探索なら9時間以上)。
| 行 | 金額 | 判定 |
|---|---|---|
| 3 | ¥4,000 | 除外 |
| 17 | ¥8,000 | 除外 |
| 18 | ¥44,000 | 除外 |
| 19 | ¥20,000 | 除外 |
| 24 | ¥15,120 | 除外 |
| 行 | 金額 | 判定 |
|---|---|---|
| 2 | ¥4,000 | 計上 |
| 4 | ¥1,140 | 計上 |
| 5 | ¥1,140 | 計上 |
| 6 | ¥18,000 | 計上 |
| 7 | ¥57,681 | 計上 |
| 8 | ¥75,429 | 計上 |
| 9 | ¥29,500 | 計上 |
| 10 | ¥28,000 | 計上 |
| 11 | ¥80,000 | 計上 |
| 12 | ¥75,000 | 計上 |
| 13 | ¥60,000 | 計上 |
| 14 | ¥85,000 | 計上 |
| 15 | ¥80,000 | 計上 |
| 16 | ¥54,000 | 計上 |
| 20 | ¥2,497,000 | 計上 |
| 21 | ¥2,610,500 | 計上 |
| 22 | ¥132,000 | 計上 |
| 23 | ¥132,000 | 計上 |
| 25 | ¥16,800 | 計上 |
| 26 | ¥100,000 | 計上 |
| 27 | ¥105,000 | 計上 |
| 28 | ¥30,000 | 計上 |
| 29 | ¥30,000 | 計上 |
| 30 | ¥5,460 | 計上 |
| 31 | ¥1,000 | 計上 |
| 32 | ¥1,100 | 計上 |
| 33 | ¥32,000 | 計上 |
| 34 | ¥361,500 | 計上 |
| 35 | ¥179,000 | 計上 |
| 36 | ¥358,000 | 計上 |
この問題は「部分和問題」と呼ばれ、データ件数が増えると計算量が爆発的に増加します。Excelの標準機能では解けません。
〜20件:Excel + ソルバーで対応可能
20〜40件:AIツール(Gemini/ChatGPT等)を推奨
40件以上:専用プログラムが必要
以下のプロンプトをコピーして、データ部分を差し替えて使用してください。
以下の金額リストから、合計が【目標金額】を超えないように、かつ最大限近づく組み合わせを見つけてください。 ■ 目標金額 7,240,268円(この金額を超えてはいけない) ■ 金額リスト(1行1件) 4000 4000 1140 1140 18000 57681 75429 29500 28000 80000 75000 60000 85000 80000 54000 8000 44000 20000 2497000 2610500 132000 132000 15120 16800 100000 105000 30000 30000 5460 1000 1100 32000 361500 179000 358000 ■ 出力形式 1. 計上する項目の一覧(行番号と金額) 2. 除外する項目の一覧(行番号と金額) 3. 計上合計金額 4. 目標金額との差額 ■ 注意事項 - 各金額は「計上する」か「しない」かの二択です - 数学的に最適な解を求めてください - 近似解ではなく、厳密な最適解をお願いします
A列に金額、B列に判定用(0または1)、C列に A×B の計算式を入れる
データ → ソルバー(なければアドインから有効化)
目的:C列合計を最大化 / 制約:C列合計 ≦ 目標金額、B列は0か1のみ
「半分に分ける」というシンプルな発想で、計算不可能な問題を1秒で解ける問題に変える。これがアルゴリズムの力。