は、次のような問題を考えてみましょうコインのサブセットを識別し、num_heads
は、そのサブセット内のヘッドであるコインの数である。サブセット推論NP完了?</p> <p>がありますあなたがそれらを見ることができませんN.</p> <p>番号1〜Nのコインですが、フォームのそれらについてMの事実を与えられている:</p> <pre><code>struct Fact { set<int> positions int num_heads } </code></pre> <p><code>positions</code>
これらのM個の事実を考えれば、できるだけ多くのヘッドを開発する必要があります。
この問題はNP完了ですか?はいの場合、削減額はいくらですか?いいえ、多項式時間の解は何ですか?例えば
:事実と一致して、ほとんどのヘッドと
N = 5
M = 3
fact1 = { {1, 2}, 1 } // Either coin 1 or coin 2 is a head
fact2 = { {4}, 0 } // Coin 4 is a tail
fact3 = { {2, 4, 5}, 2 } // Out of coins 2, 4 and 5, two are heads
設定は次のとおりです。
T H H T H
だから、答えは3頭です。
おそらく私はあなたの問題について十分に長い、または十分に考えていないかもしれませんが、この問題が決定的であることを最初のものとして確信していますか? –
@ B.VB。それは確かに決定的です。簡単な指数関数アルゴリズムは、すべての2^N可能な割り当てを列挙し、M個の事実からそれらをチェックして、ほとんどのヘッドで解を追跡します。これは時間O(N M 2^N)です。 – Dougal
SATの削減が必要だと思われますが、うまく動かすことができません。私はそれがNPであることを80%確信しています。 – Dougal