P2663より多くのチーム
問題の解決策
この問題は、水またはデータです。。。(私はデータは、ああ、人々の数の半分を超えていない方法を知っています)
F [I] [J]の項目は、スコアjの最大スコアを超えていない私の前に
J・レコード・スコア。。。
そして、バックパック解決寸法をドロップ01
コード
書式#include <iostreamの> の#include <cstdioを> する#include <cstdlib> 書式#include <cmath> の#include <アルゴリズム> 書式#include < 文字列 > の#include <CStringの> の#include <キュー> 使用して名前空間はstdを、 typedefの長い長いLL。 インラインint型リード() { int型 ANS = 0 。 チャー最後=を' '、CH = GETCHAR()。 しばらく(CH < ' 0 ' || CH> 9 ')最後= CH、CH = GETCHAR()。 一方、(CH> = ' 0 ' && CH <= ' 9 ')ANS = ANS * 10 + CH- ' 0 '、CH = GETCHAR()。 もし(最後== ' - ')ANS = - ANS; 戻り値は、ANS; } INT N; INT S [ 105 ]。 int型の F [ 5005 ]。 int型 AVE = 0、ANS = 0 ; int型のmain() { Nを= )(読み取ります。 以下のために(INT iが= 1 ; I <= N; I ++)S [I] =(読み取り)、AVE + = S [i]は、 AVE = AVE / 2 。 以下のために(INT iが= 1 ; I <= N; I ++ ) のための(INT J = AVE; J> = S [I]; j-- ){ fは[j]は MAX(F [J]、F [JSを[= I] + S [I]); ANS = MAX(ANS、F [J])。 } のprintf(" %dの\ n " 、ANS)。 リターン 0 ; }