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 }