DPのバックパック

0.01バックパック:

(以下は一次元を記述するために利用可能です

これは、特定のボリュームでバックパックに詰め項目のいずれかを選択することができます。F [i] [j]はJ Iアイテムの体積までの時間で最大値を示し、。

以下のために(INT I 1 =; I <= N; I ++){

  用(INT J = V; J> = 0; J - ){

    IF(W [i]が<= J)

       F [I] [J] = MAX(F [I-1]〜[J]、F [I-1] [JW [I] + C [I])。

    他

      F [I] [J] = F [I-1] [V]。

   }

}

場所があることに注意してください:

我々はタイトルに表示さナップザック問題の最適解は、実際には、同じ質問が2つ以下があります。いくつかの質問には、「尋ね 正確に バックパックを満たした際に、最適なソリューションを」といくつかのトピックは、バックパックを充填する必要はありません。両者の違いを実現することは問題がで聞かれていることである 初期 異なる時間。
最初の質問が尋ねられる場合、単に充填袋を必要とし、その後除く初期  F. [0]は0であり 他のF [1〜V]をに設定されている -   、そう得F [V]を確保しますそれは ちょうど 満たされたバックパックの最適なソリューションを提供します。
バックパックを充填する必要はなく、唯一の可能な限り大きくする価格を希望されない場合は、初期化はF [0〜V]である必要があり 、すべて にセット  0
これはなぜでしょうか?理解することができる:Fの配列を初期化するために実際にあるときにバックパックなし品は、法的な状態に置くことができません。あなただけの完全なバックパックが必要な場合は、ので、 この時間はわずか 容量のバックパック0の場合は、インストールされ、どのような値が0であることは、他のバックパッカーの容量が法的解決策ではなかった、未定義である「フルな」であることはできません状態は、値を割り当てる必要がある  -   アップ。バックパックに充填する必要がない場合には、任意の容量のバックパックがあり 、正当な解決策を それをすべての初期状態の値が0であるように、このソリューションの値は、0である「何も、ロードされていません」。
(推奨彼らの最初の何の状態遷移過程をシミュレートし、手動で、テーブルを描く - これは非正確な状況であります
プロセスは、個人的にShoumoをお勧めします
私のアイテム(音量、値)\ j個のボリューム 0 1 2 3 4 5
1(2,3) 0 2 3 5 6 7
2(1,2) 0 2 2 4 6 6
3(3,4)  0 0 2 2 2 2
4(2,2) 0 0 0 0 0 0
私自身の理解は次のとおりです。
要件はちょうど一杯になったので、それは転送の前に、いくつかの状態をボリュームアップされている必要があります。私は簡単に状況を理解するために最初から考えます

IF(W [i]が<= J)

       F [I] [J] = MAX(F [I-1]〜[J]、F [I-1] [JW [I] + C [I])。

    他

      F [I] [J] = F [I-1] [V]。

-------------------------------------------------- -------------------------- 、言っている自分の限られた理解を理解することは本当に難しいと言いたい、スキルは、貧しいです彼は半分のソリューションを言います

データ及びコードとして、F [1]〜[J] < - F [0] [J]。ステータスのみからF F [1]〜[J] [0]状態遷移オーバー[j]は、直接継承F [0] [J]のいずれか、また、F [0]とすることができる[JW [1](すなわち、ここで、f [0] [0〜VW [I])と言うことである、転送された場合にのみ、ボリュームW正確J [1]、唯一例えばFこと[i]は[j]が値を効果的に可能な場合更新は---- Fのみ初期設定として[0] [0]の上昇は依然として非常に小さい場合であっても、他方が負の無限大であり、0です。この将来の状態遷移では、唯一の現在のボリュームの状態であれば、実際の収束が効果的に更新されるまで。初期値は負の無限大ではない場合、物品の体積は数の大きさによって制限されるため、すべてのボリュームは、状態に組み合わせることができません。
正確には、それは必ずしも既存のベースの実効転送する前に特定の状態に現在のボリュームのサイズ要件を持っていないではない場合(即ち、前述の体積は数に組み合わせることができる) - 0をとにかく。

セカンドフルバックパック:

これは、項目が選択することができ、多くの倍です。

01バックパックと(選択回数が多くなるが、すべての後に、リュックサック容積を制限しているが)複数の断片に分割する記事と併せて考えることができ

まだバックパックのアイデア01に従って解決することができます:レッツF [i]には、[V]最大重量Vバックパックのボリュームにアイテムの前に、i番目を表し、

擬似コード:

I = 1..N用

バックパックからV = 0..V // 01と異なる点について①

F [V] = MAX(F [V]、F [VW [I] + C [i])と(V> = W [i]は、1 <= I <= N)/ / 注:次元Shihai分化F. ---- [I、V] = MAX(F. [I -1、V]、F. [  I -のWi +、VのCI])②  

説明:①彼らは以前の状態0を見つけるために、以前の状態で転送することができますので、 - > N
異なり②バックパック01 I I-1項目はこれらの項目に基づいてボリューム前の状態に継承することができるが、この手段を置くように選択されます。

おすすめ

転載: www.cnblogs.com/becase/p/11858758.html