0-1ナップザック問題変形------------牛展

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)

出力

資格と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 
}

 

 

 

おすすめ

転載: www.cnblogs.com/kevin6666/p/10952138.html