分割統治事のバックパックのP4141の消失

問題の意味:$ $ボリュームや記事N-考えると、私は[1、m]は$バックパックプログラムの数は\ wの$の量で満たされ、$ $項目を削除しようとしている、$ M $の最大容量バックパック。

N項目、すなわちボリュームW1、W2、...、WNがあります。そのため、彼女の過失により、i番目の項目が表示されません。「残りのNを使用するには - xの量で満たさ1つの項目のバックパックを、いくつかの方法がありますか?」 - これは古典的な問題です。彼女は、(i、x)は、すべて1 <= iの= <Nで、1 <= xと<=カウントのM(I、x)の形を取得したいカウントと呼ば答えます。

入力:1行目の2つの整数N(1≤N≤2×10 ^ 3)、M(1≤M≤2×10 ^ 3)、及び物品のボリュームの最大数。

   2行目:Nの整数W1、W2、...、WN、記事のボリューム。

出力:N×Mの行列は、最後の桁の(I、X)を数えます。


 

アイデア:バックパック、分割統治。

送信:1回(ただクラスを伝えます)

ソリューション:

(S、L、R)は$ $ S $は第一層における間隔$は[L、R] $を表し解決$定義。

再帰的な手順:この層をコピーする一つの状態、最初の$ [のMD + 1、R] $項目は、空の状態をバックパックに加え、そして$解く(S + 1、L、MD)$、この層状態が$次に$ [L、MD] $項目は(R、1 + MD、S + 1)バックパックに加え、$解決する一つにリセットされ、境界は$ L == R $で、このこの記事は、バックパックに追加するので、出力がうまくされていないだけで$ L $。

コード:

#include <cstdioを> 
する#include <iostreamの> 
する#include <CStringの> 
する#include <CStringの>
 に#define RレジスタINT
 使用して 名前空間STDを、
// 你弱、有什么资格休息
の#define ULL符号なし長い長
 の#defineは長い長いっ
 の#define(++ I); iは= 10000000000を<(R I = 1の場合)一時停止
 の#defineにfreopenはIN(「NOIPAK ++。 」、 "R"、STDIN)
 の#defineアウトfreopenは( "out.out"、 "" W、STDOUT)
 名前空間FREAD {
     静的 チャー B [ 1 << 15 ]、* S = B * D = B。
    GETCHAR()(S == D &&(D =(S = B)+関数fread(B、1,1 << 15、STDIN)、S == D)EOF:* S ++)
 #endifの
    インラインINT G(){ 
        R RET = 0、=解決1登録のchar chのを。
        しばらく(!isdigit(CH = getchar関数()))
            修正 = CH == ' - ' - ?1 :修正します。
        もし(CH == EOF)の戻りEOF;
        DO 
            RET = RET * 10 +(CH ^ 48 )。
        一方、(isdigit(CH = GETCHAR()))。
        返す * RETを修正; 
    } 
    インラインブールのisEmpty(CONST  チャーCH){
         リターン(CH <= 36 || CH> = 127 )。
    } 
    インラインボイド GS(チャー *のS){ 
        登録チャー CHと、一方(のisEmpty(CH = GETCHAR()))。
        やる * S ++ = CHを; しばらく(!のisEmpty(CH = getchar関数())); 
    } 
} 
使用FREAD :: Gと、
使用FREAD :: GSを。

名前空間Luitaryi {
 のconst  int型N = 2010 INTのN、M。
INT [F 15 ] [N]、[N] W。
インラインボイドは(解決INT S、INT L、INT R){
     場合(L == R){
         (R I = 1 ; I <= M; ++ I)のprintf(" %dの" [S-F、1 ][私]); 
        putchar(' \ nを'); 返します
    } 
    R MD = 1 + rを>> 1 
    memcpy(F [S]、F [S - 1 ]、はsizeof(F [S- 1 ]))。
    (R I =のMD + 1 ; I <= R; ++ I)のための(R J = M; J> = W [i]は、 - J)
        F [S] [J] + = F [S] [ = JW [I]、F [S] [J]%10 
    解決(S + 1 、L、MD)。
    memcpy(F [S]、F [S - 1 ]、はsizeof(F [S- 1 ]))。
    (R I = 1; I <= MD; ++ I)のための(R J = M; J> = W [i]は、 - J)     
        F [S] [J] + = F [S] [JW [I]、F [S] [j]の%= 10 
    解決(S + 1、MD + 1 、R)。
} 
インラインボイドメイン(){ 
    N = G()、M = G();
    以下のための(R i = 1 ; iが<= N; I ++)[I] = W G(); 
    F [ 0 ] [ 0 ] = 1解決(11 、N)
} 
} 

(){主署名さ
    Luitaryi ::メイン()。
    リターン 0 ; 
}

2019年7月14日

おすすめ

転載: www.cnblogs.com/Jackpei/p/11183857.html