目標が動的プログラミング(他のアプローチの代わり)を使用することであるという問題に出くわしました。スパンする距離と、異なる長さのケーブルのセットがあります。距離を正確にスパンするために必要なケーブルの最小数は何ですか?
私にはこれはナップザック問題のように見えましたが、特定の長さの倍数がある可能性があるため、0/1ナップザック問題ではなく、有界ナップザック問題でした。(各アイテムの値をその重さとして扱います。)単純なアプローチ(および検索スペースの拡大を気にしない)を採用し、境界ナップザック問題を0/1ナップザック問題に変換するために使用した方法は、単に倍数を単数に分割し、よく知られている動的プログラミングアルゴリズムを適用します。残念ながら、これは次善の結果につながります。
たとえば、指定されたケーブル:
1 x 10ft、
1 x 7ft、
1 x 6ft、
5 x 3ft、
6 x 2ft、
7 x 1ft
ターゲットスパンが13フィートの場合、DPアルゴリズムは7 + 6を選択して距離をスパンします。貪欲なアルゴリズムは10 + 3を選択しますが、これはケーブルの最小数のネクタイです。15フィートをスパンしようとすると、問題が発生します。DPアルゴリズムは最終的に6 + 3 + 3 + 3を選択して4本のケーブルを取得しましたが、貪欲なアルゴリズムは3本のケーブルだけで10 + 3 + 2を正しく選択しました。
とにかく、境界を0/1に変換する軽いスキャンを行うと、複数のアイテムを{p、2p、4p ...}に変換するよく知られたアプローチのようです。私の質問は、p + 2p + 4pが複数のアイテムの数にならない場合、この変換がどのように機能するかです。たとえば、5本の3フィートケーブルがあります。3 + 2 x 3 + 4 x 3> 5 x 3であるため、{3、2x3、4x3}をあまりうまく追加できません。代わりに{3、4x3}を追加する必要がありますか?
[現在、「オレゴントレイルナップザックの問題」の論文を読み込もうとしていますが、現在使用されているアプローチは動的プログラミングではないようです。