トピックリンク:https://vijos.org/p/1240、
次の2組のカップルを持っている場合、彼らは、男性と女性一緒に、ないより劣るかもしれないが、より良い男性を破る場合は部屋にもより多くの人を下に置くことができるかもしれので、少し思考の後、見つけることができます。
だから、状況は一緒に最高の夫と妻の生活をされていないか、または唯一のカップルが一緒に暮らすこと。
DPによって[J] [K] [0]の配列Jに人を表し、女性K、使用される最低費用対、DP [j] [k]が[1]配置Jを人が表していない、女性k個、最小値が使用さカップルを費やしています。
コード:
書式#include <cstdioを> する#include <CStringの> の#include <アルゴリズム> 使用して 名前空間はstdを、 int型M、F、R、C。 INT DP [ 310 ] [ 310 ] [ 2 ]。 int型 B [ 310 ]、P [ 310 ]。 INT メイン(){ scanf関数(" %D%D%D%D "、&M、&F、&R&C)。 以下のために(int型私= 1 ; I <= R; iが++ ){ scanf関数(" %D%D "、&B [i]は、&P [I])。 } memsetの(DP、 0x3fを、はsizeof (DP))。 DP [ 0 ] [ 0 ] [ 0 ] = 0 。 DP [ 0 ] [ 0 ] [ 1 ] = 0 。 以下のために(int型 I = 1 ; I <= R; iは++ ){ ため(INT J = M; J> = 0 ; j-- ){ ための(int型 K = F; K> = 0 ; k-- ){ もし(J> = B [I]){ DP [J] [K] [0 ] =分(DP [J] [K] [ 0 ]、DP [JB [I] [K] [ 0 ] + P [I])。 DP [J] [K] [ 1 ] =分(DP [J] [K] [ 1 ]、DP [JB [I] [K] [ 1 ] + P [I])。 } 他{ DP [J] [K] [ 0 ] =分(DP [J] [K] [ 0 ]、DP [ 0 ] [K] [ 0 ] + P [I])。 DP [J] [K] [ 1 ] =分(DP [J] [K] [ 1 ]、DP [ 0 ] [K] [ 1 ] + P [I])。 } もし(K> = B [I]){ DP [J] [K] [ 0 ] =分(DP [J] [K] [ 0 ]、DP [J] [KB [I] [ 0 ] + P [I])。 DP [J] [K] [ 1 ] =分(DP [J] [K] [ 1 ]、DP [J] [KB [I] [ 1 ] + P [I])。 } 他{ DP [J] [K] [ 0 ] =分(DP [J] [K] [ 0 ]、DP [j] [ 0 ] [ 0 ] + P [I])。 DP [J] [K] [ 1 ] =分(DP [J] [K] [ 1 ]、DP [j] [ 0 ] [ 1 ] + P [I])。 } 場合(j> = 1 && K> =1 && C> = 1件の && B [I]> = 2 ){ DP [J] [K] [ 1 ] =分(DP [J] [K] [ 1 ]、DP [J- 1 ] [K- 1 ] [ 0 ] + P [I])。 } } } } int型 ANS =分(DP [M] [F] [ 0 ]、DP [M] [F] [ 1 ])。 もし(ANS == 0x3f3f3f3f ) ANS = - 1 。 printf(" %dの" 、ANS)。 リターン 0 ; }
私はLZの間違った変更を助けるために兄をありがとうございます。
LZギャングブログ:https://www.cnblogs.com/zhuier-xquan/