1 の#define HAVE_STRUCT_TIMESPEC 2の#include <ビット/ STDC ++ H> 3 使用して 名前空間STDを、 4のtypedef 構造体ノード{ 5 INT ヴァル。 6 INT W [ 10 ]。 7 } SRT。 8 SRT [ 100007 ]。 9 ブールCMP(SRT A、SRT B){ 10 リターン a.val> b.val。 11 } 12 長い 長い DP [ 100007 ] [ 130 ]。 13 int型のmain(){ 14の IOS :: sync_with_stdio(偽); 15 cin.tie(NULL)。 16 cout.tie(NULL)。 17 INT N、P、KK。 18 CIN >> N >> P >> KK。 19 のために(INT iは= 1 ; iが<= N; ++ I) 20 CIN >> [I] .val。 21 のために(INT iは= 1 ; iが<= N; ++ I) 22 のための(INT J = 1 ; J <= P; ++ j)は 23 CIN >> [I] .W [J- 1 ]。 24 ソート(A + 1、A + 1 +、N-、CMP); // 降順寄与チアリーダーに従って、後ろのみ選手チームメンバーとして、特定のチアリーダーのP + KKは前にいずれかを生成するので 25 のmemset(DP 、0xCF、はsizeof(DP)); //は、未処理状態の最小値ので、小さな負の数に初期化 26である DP [ 0 ] [ 0 ] = 0 ; 27 用(INT I = 1 ; I <= N; ++ I){ 28 のために(INT J = 0 ; J < 1。 << P; ++ J){ 29 のために(INT K = 0、K <P; ++K) 30 IF(J&(1 << K))// iはk番目の位置を埋める人 31は DP [I] [J] = MAX(DP [I]、[J]、DP [I- 1 ] [J ^(1。 I] .W [K] + A [)<< K); //は、最大更新 32を INT MX = I- 1。 ; // 番号チアリーダーを持っている 33がある ため(int型 K = 0 ; K <P; ++ K) 34は、 IF(J&(1 << K)) 35 MX; // のようないくつかのチームメンバー 36 IF(MX <KK)// オープン依然としてチアリーディング 37 DP [I] [J] = MAX(DP [I]、[J]、DP [I- 1 ] [J] + A [I] .val); // の最大値更新 38が 他の 39 DP [I] [J = MAX(DP [I]、[J]、DP [I- 1 ] [J]); //が押し戻さ 40 } 41である } 42は COUT << DP [N-] [(1 << P) - 1 ] 、 43である 戻り 0 ; 44れます }