彗星OJ - コンテスト#11 B usiness

トピックのアイデア:

それは毎日の端にあるノード、そうなりますと、明らかにDP問題は、ステージとしての日数で、その後、完全なバックパックの内側に設定され、最後のサイクルの日数をだけでなく、一日の終わりに得られたノードを追加するためのループを追加します。

DP [U]は最終的に今uは、注意すべきいくつかの場所は、2000サイクルからのノードの現在の数があるすべての最初の、あるノードの場合、ノードの数を取得することを表し、[i]とkの範囲Wとしては、1000あなたが現在千個のノードがあると言うなら、ノードはまた、1000年を受け取ったので、最大で2000のノード(ノードkの取得が0より大きい)があるかもしれません。あなたが毎日得るノードの最大数を取るために、最終的なプラスが続きます。最後に、現在の答えにいくつかのノードを追加することを忘れないでください。

 

コード:

 

#include <ビット/ STDC ++ H>
 使用して 名前空間STDを、
INTの DP [ 10010 ]、W [ 10010 ]、N、M、K、ANS。 < INTINT > P [ 101 ]。// 代表题目中的AI、BI 
INT メイン()
{ 
    memsetの(DP、128はsizeof (DP))。
    scanf関数(" %D%D%D "、&​​N、&M、およびK);
    以下のためにint型 I = 0 iは++; iは= Kを< 
        のscanf(" %dの"、&W [I])。
    int型 I = 1 ; I <= M; iが++ 
        のscanf(" %D%D "、&​​P [i]が1次回、&P [i]の.second)。
    DP [ 0 ] = 0 ;
    以下のためにint型 i = 1 ; iが++; iが<= N)// 天数
    {
         ためのint型 J = 1 ; J <= Mであり、j ++)// 存储方式
            のためのINT U = 2000 ; U> = 0 ; U-を- )// 当前有的节点数 
                DP [U] = MAX(DP [U]、DP [U + P [j]が1次回] +; P [J] .second)
         のためのINT = U 2000 ; U> = 0 ; U - )// プラス一日の終わりに得られたノードの数 
            DP [W U + [U] = MAX(DP [U + W [U]、DP [U]); 
    } 
    ためint型 I = 0 ;私は= < 2000 ; Iは++ 
        ANS = MAX(ANS、DP [I] + I); // ノードプラス得最後に等しい最終的な答えは上の現在のノードのいくつか 
    のprintf(" %のD " 、ANS);
     戻り 0 ;   
}

 

おすすめ

転載: www.cnblogs.com/loganacmer/p/11567329.html