1365:Pku2184牛展
説明
彼女の牛ベッシーNが展示で乳牛の数から選択され、彼女は各ヘッドを表す2つのインデックス各牛、SiとFiの(-1000 <=のSi、Fiの<= 1000)が与えられています牛スマートインデックスと幸福指数。もちろん、彼女は牛シリコンFiと最大の合計値、および順序での選択は彼女の牛に包括的な開発を表示することが期待、およびSi Fiのそれぞれの合計は0以上。
入力
行1:牛の数N、N <= 100
2 N + 1行の各牛のSiとFI
のSi(-1000 <= Siの<= 1000)
Fiの(-1000 <= Fiの<= 1000)
2 N + 1行の各牛のSiとFI
のSi(-1000 <= Siの<= 1000)
Fiの(-1000 <= Fiの<= 1000)
出力
資格とFI-Siとの合計の最大値
サンプル入力
5
-5 7
8 -6
6 -3
2 1
-8 -5
サンプル出力
8
この質問は、質問より古典的な01のバックパックのばらつきがあります
ドミノこの質問にも同様の問題である、
あなたも検索を行うことができます。良好な値は、ルールを作るために、非準拠の可能要素のノートを作る正しい最適値を見つけると同時に、すべてを追加しました。
時々、ナップサック(部分的スタック)が少ない山にランダム山からランダム貪欲、より一般的なアイデアを行うために使用することができます。
この質問はほとんどの場所ので、ピットであります
-0x3fffffff割り当てfの配列を初期化するとF(実際十分-200000で)[1000000] = 0度ユーモアために発生することができ
マイナス。
コードを参照してください。
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 const int型 INF = 0x3f3f3f3f 。 int型の DP [ 200001 ]。 INTの値[ 101 ]。 INT重量[ 101 ]。 int型のn; INT のmain() { int型 K = 100000 。 しながら(〜のscanf(" %d個"、&N)) { ため(int型 I = 0 ; iがN <; Iは++ ) { scanf関数("%D%D 」、および値[i]は、&重量[I]); } ため(int型 iは= 0 ; iは= < 200000 ; iは++)DP [I] = - INF; DP [K] = 0 ; のために(int型 I = 0 ; iが<N; iが++ ) { 場合(値[I]> 0 ) { ため(INT J = 200000 ; J> =値[I]; j-- ) であれば(DP [J-値[I ]]> - INF) DP [J] = MAX(DP [J]、DP [J-値[I]] +重み[I])。 } 他 { ため(INT J = 0 ; J <= 200000 +値[I]; J ++ ) 場合(DP [J-値[I]]> - INF) DP [J] = MAX(DP [J]、DP [J-値[I]] + 重量[I])。 } } int型 ANS = 0 。 以下のために(int型 = Iを100000 ; iが<= 200000は、iは++ ) 場合(DP [i]が> = 0 && DP [I] + I- 100000 > ANS) ANS = DP [I] + I- 100000 。 printf(" %d個の\ n " 、ANS)。 } 戻り 0 。 }