トピックのアイデア:
それは毎日の端にあるノード、そうなりますと、明らかに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。 対 < INT、INT > 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 ; }