タイプリーチ01リュック--- P1504ビルディングブロックの城

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 ; 
}

 

 

 

おすすめ

転載: www.cnblogs.com/xiaoyezi-wink/p/12012444.html