回答:
ナップザック問題は、数値が2進数として与えられた場合、です。この場合、動的プログラミングは、を完了するために指数関数的に多くのステップ(入力のサイズ、つまり入力のビット数)を取ります。
一方、入力の数値が単項で与えられた場合、動的計画法は多項式時間(入力のサイズ)で機能します。
この種の問題は、弱いと呼ばれ。
:入力の提供に使用されるエンコーディングの重要性を理解するもう1つの良い例は、通常のアルゴリズムを検討して、数値がからまでの素数であるかどうかを確認し、それらのいずれかが分割するかどうかを確認することです これは多項式ですが、必ずしも入力サイズではありません。がバイナリで与えられる場合、入力のサイズはあり、アルゴリズムは時間内に実行されますこれは入力サイズで指数関数的です。そして、問題の通常の計算の複雑さは、入力のサイズです。
m
(パックサイズ)とn
(アイテムのnumが)右、全く不明ですか?そして、「数字が2進数として与えられたとき」について...しかし、あなたは何かのためにそれを言うことができませんでしたか?ほとんどのアルゴリズムでは、ベース10の入力サイズについて説明します。なぜここでバイナリについて説明するのですか?また、バイナリ、8進数、10進数などでエンコードするかどうかはactual
、メインアルゴリズムループを反復処理する回数はn
との両方に直接依存しW
ます。
主な混乱は、「サイズ」と「値」の違いにあります。
「多項式時間」は、入力のサイズに関する多項式を意味します。
「疑似多項式時間」は、入力の値に対する多項式を意味します。これは、入力のサイズに対して指数関数的であることと同等であることを示すことができます。
つまり、が入力のサイズを表し、が入力の値を表すとします。
多項式時間: ための
疑似ポリ。時間: ための
ここで、ナップザック問題には、多項式ではなく擬似多項式の解があります。これは、動的計画法の解決が値に依存する実行時間を与えるためです。つまり、で、は最大容量を表す値です。
これで、値を表すために必要な桁数で表現することで、値をサイズに変換できます。 は、基数を使用してを表すために必要な桁数を示します。これはで解決できます:
これを擬似多項式時間定義に接続すると、指数関数的であることがわかり。
疑似ポリ。時間: for