P1504のビルディングブロックの城
問題の解決策
タイプリーチ01リュックサック
いくつかの高さに到達することができ城の各セットについて
しかし、我々はすべての公共のバックパックの最大の高さに到達することができますさを求めています
F [i]は、城のためのセットを表す高さjを達することができる、我々はn回を走りました
G [i]には、すべての城を表し、あなたがjの高さに到達することができます
コード
書式#include <iostreamの> の#include <cstdioを> する#include <cstdlib> 書式#include <アルゴリズム> 書式#include <cmath> の#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; } ブール F [ 10005 ]、G [ 10005 ]。 整数 nは、[ 10005 ]、TOT = 0、和= 0、ANS = 0 。 INT メイン() { N = )(読み取ります。 以下のために(INT iが= 1 ; I <= 10005 ; I ++)Gを[I] = 1 。 用(int型、T = 1 ; T <= N; T ++ ){ TOT = 0 ;和= 0 。 memset(0、はsizeof ())。 memsetの(F、0、はsizeof (F))。 一方、([++ TOT = 読み取る()){ 場合([TOT] == - 1 ){ TOT -。 ブレーク; } 和 + = [TOT]。 } F [ 0 ] = 1 ; 以下のために(INT iが= 1 <; I = TOT I ++ ) のための(INT j--; = [I] J =和J> ) F [J] = F [J = |をA [I]]。 以下のために(INT iが= 1 ; I <= 10005 ; I ++)G [I] = G [i]が&F [i]は、 } ため(INT iが= 0 ; I <= 10005(G [i])とANS =; I ++)であれば、私。 printf(" %dの\ n " 、ANS)。 リターン 0 ; }