https://www.cnblogs.com/DJC-BLOG/p/9416799.html
アルゴリズムはあまりにも抽象的に説明します。よく理解されていないが、最善の方法は、ステップバイステップを書き出すことです。
コアナップザック問題がM [i]は[J] = MAX(M [I-1]〜[J]、M [I-1] [JW [I] + V [I])この式は、それがまだ少し面倒であることを理解することです心愚かな人々の、特に私のようなもの。だから、コードの私の最初の作品で、その後、データはライン上のステップバイステップであることを分析します。
最初のコードで:コードの行に少し見て、私に次のキーの説明は、理解するために再度行きます。
#include <iostreamの> する#include <アルゴリズム> 名前空間STDを使用して、 CONST INT N = 15; //想定し、そのアイテムの最大数 INT V [N] = {0,8,10,6,3,7,2 }; / /価格 [N] = {0,4,6,2,2,5,1 W INT //;} ボリューム INTのmain() { int型のM [N] [N] = {0}; // M [I ] [j]はiは、j個のナップザック容量を得ることができるアイテムの配列を表す場合、最大値 INT N = 6、C = 12 ; //アイテム6の数を設定し、バックパック12の容量である 。(INT I = 1 ; I <= N; I ++ )// 通過項目数 { (INT 1 = Jため; J <= C; J ++)//様々な容量 { IF(J> = W [I])//この場合バックパックの電流容量より記事以上の重量ときに [I-1] [j]は容量jのI-1番目の項目の値である// M // M [I-1] [ JW [I]は、 これは私です-1物品、ナップザック容量JW [i]のときに最大値 M [I] [J] = MAX(M [I-1]〜[J]、M [I-1] [JW [I] + V [I])。 バックパック//それ以外の容量が少ない記事の現在の体重よりも M [i]は[J] = M [I-1]〜[J]; // ときにバックパックの重量最初のi-1番目の項目を維持する } } ため(I ++ INT I = 1;; I <= N) { (用1 J = INT; J <= C; J ++) { COUT << M [I] [J] << ''; } COUT << ENDL; } 戻り0; }
Mの意味を説明する[I] [j]は、物品、パケットサイズがJ、パケット内の最大値であるケースの場合にはIです。
また、:ここで、値とその最初のリストに追加される00から始まるの体積、ので、私は=とき、M [I-1] [j]を有する式1 mが[0] [j]が0でありますどんなに確かに0友人でどのくらいの時間、商品のJ等しい種類。
まあ、コードシーケンスに従って、次は再び歩くことを、理解するために再び行きます。まず、下りデータシート
ボリューム | 値 |
0 | 0 |
4 | 8 |
6 | 10 |
2 | 6 |
2 | 3 |
5 | 7 |
1 | 2 |
私たちは、6にバックパック12の容量を記事のコード番号を設定します
提供M [N] [N] N事実は(アイテムの数、バックパックの容量)が最大です。しかし、大きなポイントとは、すべての権利を設定します。
そして、次のI(x、y)の代わりにM [I] [J]との最初のトラバーサルを開始します。
上記コードのトラバーサル順序に従って。
場合品物の種類0 0ナップザック容量または0の合計値が疑いある---->だから(0、J)= 0、(I、0)= 0
1)場合には、物品、及び物品つ0
場合アイテム番号が1だけ場合物品、電流はバックパック1の物品の体積よりも容量も大きいか否かが判定される場合にはバックパックの容量です。
一つは、このようにして(I-1、j)を維持し、第4条の体積を確認することができ、0(0,1)時間の値です。
同様にバックパックが3の場合、我々は、能力を持っている1は、物品の体積よりも小さい場合、パケット内の値、それは独自の(I-1、j)に等しいので、0です。
従って(1,1)(1,2)(1,3)が0であります
電源に(1,4)、この時間は1条、パッケージの容量の体積に等しい同じではありません。今回はに行きたかったです。
どのように裁判官にそれが保持して置きますか?私たちは、4つのボリュームの値がケースのパッケージがあることを確認見るために4のためのスペースを解放するために私たちのバックパックを与えます。ランク1は、その後、前記事及び(0,4)のような比較に置かれます。
ルック式(I、J)= MAX(項目+ 1の数の(I-1、J)、(I-1、文書番号のJ-1容積)値)。
いない現在、または以前のI-1のGeアイテムの場合、アイテムということを意味し、この単純な問題で、I-1、。
JW [i]は、現在の手段の電流容量を引いアイテムですナップザック
次いで、(I-1、文書番号のJ-1容積)値項目+1)の数は物品1の値の後に空いた4つのボリュームに配置され、この値は一件の記事の値8
明らかに、8> 0、そう(1,4)= 8
次4-12同様に、だけそう物品8が正しく適切に次にであることを(1,4)、(1,5)...(1、12)である8
2)場合資料番号場合がある0,1,2
まず、(2,0)= 0これは何も間違っています
(2,1)、2未満リュック物品ボリュームの現在の容量、= 0、(2,1)、(2,2)、(2,3)であります
(2,4)の時間が変更されたときに、(2,4)は、我々が使用するように、依然として少ない物品2の電流量よりも(1,4)は、物品の番号0及び1を表す(1,4)場合我々は、上記計算したバッグの最大値は、8ので、(2,4)= 8です。
(2,5)または8と同様にすべての方法。
(2,6)、この時間は、パッケージが2鎮圧されたとき、スペースが1 2が今に入れていない、6を空いたし、その後(後しかし、我々は、2番それらに6つの項目のためのスペースを解放する2つのアイテムを与えます、0)= 0、そして今に2は、(2,6)数+2 10の項目の値であります
(1,6)以降=そう8 <10(2,6)= 10
同様に、(2,7)...(2,9)が10であります
私たちはその後、一緒にバッグに2つの項目を取り付けたので、(2,10)、彼らが送信するとき、この変更は、私たちは第2メイク6つの宇宙の発見(1,4)= 4を与えるとき、下に置くことができたとき。これは、(2,10)= 18となります。
この2つの例を通して、私たちは非常に明確でなければなりません
今、私は結果を見てはそうではありません印刷します。
鋸何も間違っています。そして、私は本当にそれから、次は、このようなものです最大の価値を得るために、最後の、説明したいです。直接M [6]ライン上の[12] = 24。
要するに、最も重要なは、その文であります
M [i]は[J] = MAX(M [I-1]〜[J]、M [I-1] [JW [I] + V [I]])
しかし、理解が十分ではありません、最高の控除は、自分は再び、私は、これは困難習得するための最良の方法だと思います。
それは多くの詳細を欠場するの内側に脳を考え、推論は再び本当に理解することができます。