タイトル説明
最後に、彼はミレニアム問題が割れました。FFは、数え切れないほどの貴重な宝物で満たされた小さな王室の宝物室は、......この小さなFFはいんちき、豊かなことができました。しかし、ここで宝物は小さなコレクションのFF車は、非常に多くの宝物を保持しているようだ、あまりにも多くのです。それはそうですわずかな涙FF FF ......宝物が併合された小さな洞窟は、彼が各サンプルは宝個以上を有することを見出した宝物の一部をあきらめます。彼はおおよそ宝のあらゆる種類、スクリーニングの開始後宝で値を推定:小FFはW収集車の最大負荷を有する、洞窟は、宝物のn種類、V各宝の値[i]は、重みの合計を有しますW [i]は、各宝Mと[i]をメンバの。車のコレクションをオーバーロードしない前提の下でFF少しの希望、収集車に入れ、いくつかの宝物を選択し、その値と最大ようにします。
入力形式
最初のライン整数N及びwは、それぞれ、宝物を運ぶ種の最大数を表し、車を収集します。
最初の番号がi型積値のi番目の行を示し、第2の整数アイテム・クラスの重みを表し、アイテムの第三のクラスの整数次の3つの整数のn行ごとの行、。
出力フォーマット
取得車両の場合に収集宝物の最大値を表す出力単一整数ANSは、オーバーロードされていません。
サンプル入力と出力
入力#14 20 3 9 3 5 9 1 9 4 2 8 1 3出力#147説明/ヒント
データの30%:n≤Σm[I]≤10^ 4;0≤W≤10^ 3。
データの100%に:n≤Σm[I]≤10^ 5。
0 <w≤4* 10 ^ 4:1≤n<100。
M(バックパックの容量):最適化の複雑させずに複数のバックパック$ \ sum_ 1 = {I}} ^ {N-CNT [I] $。
バイナリ複雑さの最適化:M(バックパックの体積)ログ($ \ sum_ 1 = {I}} ^ {N-CNT [I] $)。
バイナリ最適化されたコードを添付
1つの#include <ビット/ STDC ++ H> 2 の#define再INTレジスタ 3 の#define MAXN 40000 + 5 4 の#define maxn1 1600 + 5 5 6 7 使って 名前空間STDを、 8 整数M、N、[MAXN] F。 9 INT ウェイ[maxn1]、ヴァル[maxn1]。 10 INTの 重量値、WCNT、CNT。 11 のint main()の 12 { 13 IOS :: sync_with_stdio(偽)。 14 CIN >> N >> M。 15 のためには、(I =再1 ; iが<= N; I ++) 16 { 17 CIN >>値>>重量>> WCNT。 18 のための(TMP再= 1 ; TMP <= WCNT TMP << = 1 ) 19 { 20 ヴァル[++ CNT] =値* TMP。 21 ウェイ[CNT] =体重* TMP。 22 wcnt- = TMP。 23 } 24 であれば(WCNT)ヴァル[++ CNT] =値* WCNT、ウェイ[CNT] =体重* WCNT。 25 } 26 のために(再i = 1 ; iが<= CNTを、I ++ ) 27 のための(再J = M; J> =ウェイ[I]; j--) 28 F [J] = MAX([J]、F [J-ウェイ[I] + F ヴァル[I])。 29 COUT << F [M]。 30 リターン 0 ; 31 }