図1に示すように、多段決定
(1)無制限の項目のナップザック問題
硬貨が見つかった元の問題の比較は、単に元の重量属性を追加してなるない問題が始点C(任意のエンドポイント)、辺の重みの最大の和を見つけるためになるように、重み付けされたグラフを図題しますパス、反対
D(S)= MAX(D(SV [I])+ 1)变为D(S)= MAX(D(SV [i])とW + [I])。
(2)0-1ナップザック問題
計画における動的ステージとして知られている近づい完了は、その状態は、応答ツリー、再帰関数CUR充填されている現在位置であるツリーの回答層を後戻り意思決定の数を記述する転送と同様です。
配置されたD(i、j)はi層内の電流を表し、ナップザック残容量がjと次の最大重量と、D(i、j)は=最大{D(I + 1、j)は、D(I + 1であります、JV [i])と[I]}、境界であるW + I>場合、N、D = 0。簡潔には、D(i、j)が、最初のiを表し、I + 1 ,,, N物品の能力を打ちます
バックパックのJ最大総重量。
以下のために(int型 I = N; I> = 1 ; i-- ) のための(int型 J = 0 ; J <= C; J ++ ) { D [i]は[J] =(I == N?0:D [I + 1 ] [J])。 もし(J> = V [i])とD [i]は[J]> = D [I +?1 ] [JV [I] + W [i]は、 }
2、計画の方向
さらに対称定義することができる:F(i、j)がi番目の記事を表すバックパックjの全重量の最大容量の前部に取り付けられています。
F(i、j)は=最大{F(I-1、j)は、F(I-1、JV [I])+ W [I]}、最終回答F(N、C)
以下のために(int型 i = 1 ; iが<= N; I ++ ) のための(INT J = 0 ; J <= C; J ++ ) { F [I] [J] =(Iの== 0?0:[I-F 1 ] [J])。 もし?[I-F =(J> = V [i])と[I] [J] F> 1 ] [JV [I] + [I] W。 }
3、回転式配列
memsetの(F、0、はsizeof (F))。 以下のために(int型私= 1 ; iが<= N; iが++ ) { scanf関数(" %D%D "、&V、およびW) 用(int型 J = C; J> = 0 ; j-- ) であれば(j> = V)F [j]が> = F [JV] +?W。 }
再帰的な方法では、特別な順序を計算し、はるかに使用された元の状態に新しい状態を計算しているように、アレイをスクロールすることを試みることができます。しかし、印刷ソリューションのソリューションは、複雑になります。辞書式に最小の印刷要件の実施形態では、注意スクロール配列、及び方向は、一般に、物品の最大重量の方向にi番目のプログラミング後に予定されています。