トピック - 古典的な動的計画

クラシック動的計画

(更新中...)

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 }

 

おすすめ

転載: www.cnblogs.com/XZDSF/p/11303727.html