問題の意味:$ $ボリュームや記事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。解決(1、1 、N) } } (){主署名さ Luitaryi ::メイン()。 リターン 0 ; }
2019年7月14日