問題のバレーロサンゼルスの溶液から借用
このタイトルは、ナップザック問題です。これは、2つのセットの間の関係を差分ダイナミックコンプライアンス問題のクラスです。ほとんどの値は、実行可能性のために変換することができます
ナップザック問題は、体積と重量との間の関係を確立することです
私たちは、タイトルへの転換の条件に応じて、上に最初の統一の大きなバックパックの初期重量として、逆に我々はこれらの数字を記録し、数回にわたり投入することにバインドされて、問題をナップザックしてみてください。
私たちは、フリップの最小数であるために求めているので、私たちはバックパックの要件に応じて、重みが求めている、アイテムのこの重量をデザイン
その後、残りの考慮事項は、ボリュームは明らかに我々は明らかに我々は唯一のボリュームナップザック問題としてカウントすることができ、ポイントの数だけ、の使用はなされていないタイトル与えられた条件の残りの部分を見つけ、あります
既知のフリップカードはとても品のボリュームという、2 *(XY)を変更する必要があります。そして、バックパックは、元の総量差ですが、私たちが求める最低重量の最大音量をインストールすることができたときにということです
なぜ最大のボリュームがありますか?それはより大きな音量も大きく差が狭まっていることを意味して最初の違いは、アップの間、私たちの要求ダウン最小の差が、最大であるため。
#include <iostreamの> する#include <cstdioを> する#include <cmath> の#include <CStringの> する#include <アルゴリズム> 使用して 名前空間をSTD。 CONST INT N = 1E5 + 5 。 const int型 INF = 0x3f3f3f3f 。 int型 DP [ 1005 ] [ 6005 ]; BOOL VS [ 1005 ] [ 6005 ]。 INT [W 1005 ]。 int型の V [ 1005 ]; INT のmain(){ int型 N、I、J、X、Y、基地 = 0、TOT = 0 。 scanf関数(" %のD "、&N) memsetの(DP、0x3fを、はsizeof DP)。 DP [ 0 ] [ 0 ] = 0 ; 以下のために(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)。 W [I] = - 1 。 TOT + = Y- X。 ベース ++ ; } } のためには、(iは= 1 ; I <= N; I ++ ){ ため(J = 0 ; J <= TOTあり、j ++ ){ DP [I] [J] = DP [I- 1 ] [J]。 もし(J> = V [i])と DP [I] [J] =分(DP [I]、[J]、DP [I- 1 ] [JV [I] +W [I])。 } } int型 RES = 0 。 以下のためには、(iはTOTを=; I> = 0 ; i-- ){ 場合(DP [n]は[I] <INF / 2 ) ブレーク。 } のprintf(" %dの"、基地 + DP [n]は[I])。 }