フォー9つの応力をバックパック:混合ナップザック問題:01、完全な、マルチミックス

N財の種類とV.のバックパックの容量があります。
商品の3つのカテゴリがあります。
*最初の記事は、一度だけ使用することができる(リュック01)。
*第二のタイプの記事は無制限(フルバックパック)することができます。
*第三のほとんどの項目は、Si(複数リュック)一度のみを使用することができます。
各ボリュームには、値をWiある、viのです。
これはバックパックにアイテムを解決する、バックパックの物品容量、最大値の和の総容積を超えることができません。
最大出力値。
入力形式
二つの整数、スペースで区切られたN、V、の最初の行は、それぞれ、商品の種類やバックパックの体積を表します。
次いで、N行、viは、wiは、Siが、スペースで区切られた、それぞれ、i番目の項目、値および数量の体積を表す三つの整数のそれぞれの行があります。
*のSi = -1、i番目の項目は一度だけ使用することができる示し;
*のSi = 0は、i番目の項目は無制限であってもよい示します。
*のSi> 0は、i番目のサブSI物品が使用されてもよい示します。
出力フォーマット
最大値を表す出力アン整数。
データ範囲
0 <N、V≤1000
0 <我々、wi≤1000
-1≤si≤1000
サンプル入力
4 5
1 2 -1
2 4 1
3 4 0
4 5 2
サンプル出力
8
1の#include <iostreamの>
 2の#include <ベクトル>
 3の#include <アルゴリズム>
 4  使用して 名前空間をSTD。
5  のconst  int型 ARRAY_SIZE = 1001 ;
6  INTのW F [ARRAY_SIZE]、N、V、V、Sであり;
7つの 構造体物品{
 8      int型V、S、W。
9  }。
10ベクター<商品> 容器;
11  INT メイン(){
 12      CIN >> N >> V。
13      のためにINT iが= 0 ; I <Nであり; ++ I){
14          CIN W >> >> V S;
 15          IF(S <= 0 16              vessel.push_back(商品{V、W、S}); // 01ナップザック問題ナップザック問題と完全なアイテムにプッシュ
。17          {
 18がある             ためint型 = K 1、K <= S、K * = 2){ // 複数のナップザック問題スイッチ01は、その後、ナップザック問題に押し込み
19。                  S - = K;
 20                  vessel.push_back(商品{K * V 、W * K、 - 1 });
 21である             }
 22は、             IF(S> 0 23は                 vessel.push_back(商品{S * V、W S *、 - 1 })。
24          }
 25      }
 26      (商品G:容器){
 27          であれば(GS == - 1// 01背包问题
28              のためにINT iは= V; I> = GV; - I)
 29                  F [I] = MAX(F [I]、F [I - GV] + GW)。
30                      //完全背包问题
31              のためにINT I = GV; I <= V; ++ I)
 32                  F [I] = MAX(F [I]、F [I - GV] + GW)。
33     }
 34      COUT << F [V]。
35 }

おすすめ

転載: www.cnblogs.com/xiehuazhen/p/12464885.html