ミラーは話は先週、小さな、小さなハイホー奮闘が最終的に宝くじの膨大な数を持って言います!そして今、小さなホーの報酬を受け取るために、最終的には時間!
ホーは今、M枚の宝くじ、賞金や賞品の面積の小さな手を持っていることは、それぞれi番目のメンバーがハードにするために、宝くじのシートを償還し、また一度交換できる賞品は、(i)必要がある必要があるN、番号1〜Nの部分を、持っています宝くじは、私の作品の最初の賞を含め、無駄それぞれのホー小さな賞品を持っているポイントは、値の値(i)を得点されません、彼は賞金のこの作品の彼の好みの値を表明しました。今、彼は賞品と交換することができ、彼の手にこれらの宝くじ、そのので、これらの値と最大の賞品の好みによって、知りたいと思いました。
ヒント1:抽象的、合理的な質問、状態の定義は、最も重要なステップである動的計画
ヒント2:もし、時間消費を削減告げ、我々はスペースの消費量を削減する方法を見て
入力各テストポイント(入力ファイル)とテストデータのセットのみ。
各試験正の整数N及びMの最初の二つの行為の数は、それが賞、及び宝くじホー手の小さい数を表します。
以下の説明N行はそれぞれの行は、前述の意味として、賞、前記iは(i)を必要とする二つの整数の挙動と値(i)を記述する。
そのテストデータを確認してください
データの100%に、Nの値は、Mの値が10以上^ 5ないが、500以下であります
2×10 ^ 5、値を超えないデータを、必要(I)の100%に(i)は超えていない10 ^ 3
サンプル入力
1000 5
144 990
487 436
210 673
567 58
1056 897
サンプル出力
2099
出力
各テストケースのために、整数アンス、ホーの出力が小さい総嗜好値が得られる表します。
#include <iostreamの>
する#include <iostreamの>
する#include <cstdioを>
する#include < ストリング >
の#include <CStringの>
する#include <アルゴリズム>
する#include <stdio.hに>
する#include < 文字列・H>
の#include <ベクトル>
#含む < SET >
使用して 名前空間、STD
のint V [ 509 ]、W [ 509 ]、DP [ 509 ] [ 100009 ]; // 配列ML結果が大きなものと二次元アレイである開始。
// 小さなWAの後、大規模な2次元配列の結果。
int型メイン()
{
int型N、バッグ。
一方、(CIN >> N >> バッグ)
{
memsetの(DP、0、はsizeof(DP))。// 初始化为0
// のmemset(V、0、はsizeof(V))。
// のmemset(0、W、はsizeof(W))。
以下のために(int型 i = 1 ; iが++; iが<= N )
{
CIN >> [I] >> W V [i]は、
}
のための(int型 i = 1 ; iが<= N; iが++ )
{
ため(INT= J 1、J <=バッグ; J ++ )
{
IF(J> = W [I])// バックパックの容量は、製品の容積を満たすようにする場合
{
// ウルトラアレイを注意境界DP
DP [I] [J] = MAX( DP [I - 1 ] [J]、DP [I - 1 ] [J - W [I] + V [I]); // 積の値と取っ積の最大値をとらない
}
他
DP [Iは] [j]は DP [I = - 1 ] [J]; // 製品の体積よりもバックパックの容積より小さい、項目のみの最大値をとることができる
}
}
COUT << DP [N-] [バッグ] << ENDLを;
}
リターン 0;
}