9.12(ドミノ+ +道路工事道路の再構築)

DP:

満足している優先順位別の値として、保存された次元の一つであるとみなすことができるが、2つの物理的な制約があることが明確でなければなりません

1つの#include <ビット/ STDC ++ H>
 2  使用して 名前空間STDを、
3  の#define N 1002年
 4  int型の DP [N] [ 10005 ]、B [N]、[N]、D [N]。
5  INT )(メイン
 6  {
 7      のmemset(DP、0x3f3f3fはsizeof (DP))。
8      INT N。
9      のscanf(" %d個"、&N)
10      のためにint型 i = 1 ; iが<= N; iが++ 11      {
 12          のscanf(" %のD%のD "、&​​A [I]、&B [I]);
 13である     }
 14      のためにint型私は= 1。 I <= N; I ++)はD [I] = A [I] - B [I] ;
 15      DP [ 0 ] [ 5000 ] = 0 ; // 確かにない値、初期化は問題がないかどうかを確認するために、転写式を代入しなければならない
16      のためにINT I = 1 ; I <= N; I ++が。17      {
 18はしない         ためint型 J = - 5000 ; J <= 5000 ; J ++)// 最小値を見つけることが最初
。19          DP [I] [J + 5000=分(DP [I- 1 ] [j + 5000 + D [I]、DP [I- 1 ] [j + 5000 -d [I] + 1 )。
20      }
 21      INT ANS = 1002 22      のためにint型 I = 0 ; iが= < 5000 ; iが++ 23      {
 24の          ANS =分(DP [n]は[I + 5000 ]、DP [n]が[ 5000 - I])。    
25          であれば(ANS <= 1000年26          {
 27              のprintf(" %d個の\ n "、ANS);
 28              リターン 0 ;
 29          }
 30      }
 31である }
 32  // 問題の貪欲
33  / * 
34である 。4
 35  。6. 1
 36  。1 5
 37  。1. 3
 38である 。1 2
 39  * /
コードの表示

バックパックとして本当にNBです。

これは実際には「皮を着たバックパックのタイトル」であります

我々は唯一の状況の微調整は、バックパックの友人を設定することができます必要な~~~

我々最初のドミノフリップフロッ、上記の点の数が多いために調整

このように、我々は、底部よりも上方の点の特定の数を保証し、そしてそれぞれが一度反転ことを確認することができ、点のより小さな数値の上下の点の間の差を作ることができ、差が上下2点で乗算されます。

ポイントなどの項目の音量を変更し、以下の見たバックパックの初期体積との相違点は、モデルは、ナップザック問題を見やすいです。

だから、アイテムの重量は何ですか?

我々は上に多数の点をオフに開始し、1に、ターン数を毎回入れているので。考えてみましょう:私はそれを後で後悔している場合、私は何をするかより良い、このドミノをオンにしないことが判明?その後、私はそれを元に戻すでしょう、そして、ドミノをオンに相当するものはありません。

したがって、それは-1であるターンドミノ重量の初めに、重量が入っていないドミノ1(重量ターン数に相当)

彼らはターンどんなには、上下のポイント差に影響を与えませんので、もちろん、同じドミノは、ダウンゼロ体積、重量アイテム0にあります。

この時点で、バックパックモデルが出てきました。この問題に単純化される:N項目があり、各項目のV [I]の量を考えると、その重量は1又は-1です。最小最大容積物品とケースの重量となるよう今バックパックの重量のためのベース、ボリュームTOTは、n個の物品が、バックパックに入るこれを呼び出し、TOTの全体積を超えることはできません。

ここで、DP [I] [j]はiは、最小重量jの体積にアイテムを保持することができる前面を示し

VS [i] [j]はiのjの項目ボリュームを提案するために添付のフロントを表し、

#include <cstdioを>
 INT DP [ 1005 ] [ 6005 ];
 BOOL VS [ 1005 ] [ 6005 ];
 int値 W [ 1005 ];
 int型 V [ 1005 ];
 int型分(INT A、int型B)
{ 

    IF(A <B )を返す;
     返すBを; 
} 
int型(メイン)
{ 

    int型 N-、I、J、X、Y、ベース = 0、TOT = 0 ;
 // Baseがバックパックの重量を表し、初期重量、ターンの最初の数であり、 
    scanf関数(" %のD "、&N)
    (i = 1 ; iが<= N; iが++ ){ 
        scanf関数(" %D%D "、およびX&Y)。
        もし(X> Y){ 
            V [I] = 2 *(X-Y)。// 点数变化量看做体积 
            W [I] = 1 
            TOT + = X - Y。
        } 
        であれば(Y> X){ 
            V [I] = 2 *(Y- X)。
            [I] W = - 1 
            TOT + = Y-X、
             ベース ++; // 初期重量
        } 
    } // オブジェクトの総体積の体積vでははるかにボリュームとしてロードTOTバックパックを、マウントされ、バックパックの総重量の重量ベースwは最小である
    ため(I = 1。 ; I <= N; I ++が){
         ため(J = 1。 ; J <= TOT; J ++ ){ 
            DP [I] [J]は DP [I- = 1 ;] [J] 
            VS [I] [J] = VSは[I- 1 ] [J];
             IF(VS [I- 1 ] [JV [I] || JV [I] == 0 ){
                 IF(! {VS [I] [J])
                    DP [I] [J]は = DP [I- 1 ] [JV [I] +W [I]、
                    VS [I] [J] = 1 ; 
                } 
                そう DP [I] [J] =分(DP [I]、[J]、DP [I- 1 ] [JV [I] + W [ I]); 
            } 
        } 
    } 
    // のprintf( "%のD"、ベース+ DP [N-] [TOTを]); 
    のための(I = TOT; Iは> = 1 ; i--)IF(VSは[N-] [I ])BREAK ;
     // 最初の記事のすべてのボリュームにインストールすることができる見つける 
    のprintf(" %のD "ベース + DP [N-] [I]); 
}
コードの表示

DFS:何も言うことは、我々は長い長い予防ブローアップしなければなりません!

木のDP:

)選択科目の書き込みのこのグループという李Yudongを輝か全:(バックパック:法律をまとめました

最初のDFSは - >息子が回顧F [X]のノードの数を列挙[T] =分(F [X] [T]、F [X] [TJ] + F [Y] [J])。

おすすめ

転載: www.cnblogs.com/lkx422/p/11515291.html