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])。