ダイナミックプログラミング(b)に0-1ナップザック問題

図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の== 00:[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番目のプログラミング後に予定されています。

おすすめ

転載: www.cnblogs.com/tuilinengshou/p/11618613.html