クラシック動的計画
(更新中...)
1。0-1 バックパック
問題の説明:商品のNUM種類及びバックパック容量Cが与えられると、各アイテムの体積はvの値、wがあり、バックパック内のアイテムを選択する方法ロード、バックパック最大の合計値にアイテムよう。各アイテムだけではなく、すべてのバッグやリュック二つのオプションに充電されます。
例:NUM = 4、C = 8
項目ボリュームI W [i]の値V [i]が
1 3 3
2 3 4
3 4 5
4 5 6
分析:各記事のための2つの方法があり、装置が下にインストールすることができず、
(1)パケットの現在の残容量が商品、フィットの容積よりも小さい、状態遷移式であります
DP [I] [j]はDPを= [I-1]〜[J] // iはi番目の項目であり、jはバックパックの現在の残容量であります
(2)現在は、物品のパック体積の残り容量よりも大きい保持することができ
DP [I] [J] = MAX(DP [I-1]〜[J]、DP [I-1] + V [i]はJW] [i])と//パッケージとパッケージ間のいずれかを選択ではありません好ましくは、DPは[I-1] [JW [I] + V [I] I-1は、残りのスペースに配置された商品アイテムの種類を複数選択前部がJW最大値[i]はバックパックを得ることができる意味プラス私の最初の記事V [i]は、
状態遷移表:
コード:
1つの#include <iostreamの> 2の#include <アルゴリズム> 3。 使用した 名前空間STD; 4 。5 // 推奨は大型アレイは、新しい新しい方法が煩雑で定義するだけでなく、境界条件を初期化する必要がある 6。 INT W [ 105 ]、ヴァル[ 105 ] ; 7 INT DP [ 105 ] [ 1005 ]; 8 。9 INT main()の 10 { 11 int型 Tは、NUMは、RES = - 1 ; 12である CIN NUM >> T、 13である ため(INT I = 1 ; I <= NUM;私は++) 14 W CIN >> [I] >> ヴァル[I]; 15 用(INT I = 1 ; I <= NUM; I ++)// 項目 16 のための(INT J = 1。 ; J <= T; J ++)/ / 容量 17 { 18は IF(J> = W [I]) // 記事の現在の容積よりも大きい容積 19。 DP [I] [J] = MAX(DP [I - 1 ] [J - W [I]ヴァル+ [ I]、DP [I - 1 ] [J]); 20は、 他の 21はある DP [I] [J] DP = [I - 1 ] [J]; 22である } 23れます COUT << DP [NUM] [T] << ENDL。 24 リターン 0 ; 25 }