DP(01ナップザック問題)

ミラーは話は先週、小さな、小さなハイホー奮闘が最終的に宝くじの膨大な数を持って言います!そして今、小さなホーの報酬を受け取るために、最終的には時間!

ホーは今、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; 
}

 

おすすめ

転載: www.cnblogs.com/nonames/p/11228441.html