リンク:https://www.luogu.org/problem/P1282
アイデア:
最小限$ B、口座$ Aに取ると、バックパックの慣行を採用することができます。
ポイント数の上から下へのカードのために、彼らは、行の現在の数を知っていれば、あなたは別のラインを知ることができるように、一定です。
提供$ fは[i] [j]は$ $ I $は$ $ J.に反転するフロント・カード、ポイントの最小数と最初の行を表します
最後に、最初の行に列挙する。
(初期化を除く)元バックパックのすべての状態が最大値を設定することに留意されたいです。
コード:
#include <ビット/ STDC ++ H> のconst int型 INF = 1 << 30 。 const int型 MAXN = 1050 ; 使用して 名前空間はstdを、 int型 N、和、RES、ミンクス= INF、ANS = INF、[MAXN]、B [MAXN]、F [MAXN] [MAXN * 6 + 5 ]。 INT メイン(){ CIN >> N。 以下のために(int型 i = 1 ; iが<= N; iは++ ){ CIN >> [I] >> B [i]は、 和 + = A [I] + B [i]は、 } のために(int型 I = 1 ; I <= N。私は++ ){ ための(int型 J = 0 ; J <= 6 * N; J ++ ) F [i]は[J] = INF。 } [F 1 ] [ 1 ] = 0 ; F [ 1 ] [B [ 1 ] = 1 。 以下のために(int型 I = 2 ; iが<= N; iは++ ){ ための(int型 J = 0 ; J <= 6 * N; J ++ ){ もし(J - [I]> = 0 ) F [i]は[J] =(F [I] [J] F [I -分1 ] [J - [I])。 もし(J - B [i]が> = 0 ) F [i]は[J] =分(F [I] [J]、F [I - 1 ] [J - B [I] + 1 )。 } } のために(int型 i = 0 ; iが<=和iが++は{) であれば(F [N] [I] == INF)を 続けます。 int型のres = ABS(I - (合計- I)); もし(RES < ミンクス){ ミンクスの =の解像度。 ANS = F [N] [i]は、 } であれば(RES == ミンクス) ANS = 分(ANS、F [n]は[I])。 } COUT << ANS << ENDL。 リターン 0 ; }