コード:
#include <ビット/ STDC ++ H> の#define N 1005 の#define M 2000 の#define setIO(S)freopenは(S ".IN"、 "R"、STDIN) 名前空間stdを使用。 INT A [N]、B [N]、W [M + 3]、F [M + 3]。 INTメイン() { // setIO( "入力")。 N INT、M、K、I、J、ANS = 0。 scanf関数( "%D%D%D"、&N、&M、およびK); 用(i = 0; iは= K <; ++ I)のscanf( "%d個"、&W [I])。 scanf関数( "%D%dの"、&A [i]は、&B [i])と(; I <= M + I I = 1)のために、 memsetの(F、-1、はsizeof(F))。 F [0] = 0; <;(I ++ = n iはi = 1)のために { (J = Mのためあり、j> = 0。 --j) { IF(F [J] == - 1)続けます。 (INT TMP = 1; TMP <= M; ++ TMP)のために { IF(J> = A [TMP]) F [JA [TMP] = MAX(F [JA [TMP]、F [J] + B [TMP])。 } } もし(!I = N) { ため(J = M; J> = 0; - J) { IF(F [J] == - 1)続けます。 F [W jは+ [J] = MAX(F [W jは+ [J]、F [J])。 } } } (j = 0; J <= M; ++ j)のための { 場合([J] F == - 1)続けます。 ANS = MAX(ANS、F [J] + W [J] + J)。 } のprintf( "%d個の\ n"、ANS)。 0を返します。 }