サマースクールキャンプオフ以上の2019頭の牛(第九のフィールド)Dナップザック暗号(バイナリ列挙)

トピックへのリンク:https://ac.nowcoder.com/acm/contest/889/D

タイトル効果:これらの数字の合計がSに等しくなるように、n個からいくつかの番号を見つけるためには、答えは「01」の文字列で表示します

レポートの問題解決: N数を2つの部分に分割され、その後、バイナリビットを列挙し、$ 2 ^ {\ FRAC {Nの合計の前部 } {2}} $ ,,種の可能なケースと、それぞれの場合に、wはあります和の後半には、$ SW $事情を見つける二つの部分をマージする答えです。

ACコード:

  1の#include <ビット/ STDC ++。H>
   2  の#define numm CH-48
   3  の#defineのPdのputchar( ' ')
   4  の#defineのPNのputchar('の\ n')
   5  の#define PB一back
   6  の#define Fiの第
   7  の#define SE第
   8  の#define FRE1 freopenは( "1.TXT"、 "R"、STDIN)
   9  の#define fre2 freopenは( "2.txt"、 "W"、STDOUT)
 10  の#defineデバッグCOUT << "デバッグ" << ENDL
 11を 使用して 名前空間はstdを、
12テンプレート<型名T>
 RES){
 14      ブールフラグ= char型のCH;
15      一方(isdigit(CH = GETCHAR())!)(CH == ' - ')&&(フラグ= )。
16      のために(RES = numm; isdigit(CH = GETCHAR()); RESの=(RES << 1)+(RES << 3)+ numm)。
17      フラグ&&(RESの= - RES)。
18  }
 19テンプレート<型名T>
 20  ボイドライト(T X){
 21      であれば(X < 0)のputchar(' - ')、X = - X。
22      であれば(X> 9)書き込み(X / 10 )。
23      のputchar(Xの%10 + ' 0 ' )。
24  }
 25のtypedef 長い LL。
26  のconst  int型 MAXN = 40 27  のconst  int型 MAXM = 505 ;
28  のconst  int型 MOD = 1E9 + 7 29  のconst  int型 INV2 = 500000004 ;
30  構造体ノード{
 31     ; V、W LL
32      LLビット。
33 } wtz [ 1 <<(MAXN >> 1 )]。
34  LLのN、S。
35  LL [MAXN]。
36   
37  ブール CMP(ノードと、ノード&B){
 38      リターン AW < BW。
39  }
 40  INTは(見出さint型 L、int型のR、LLのX){
 41      INTミッド= 0 42      一方(L < R){
 43          半ば=(L + R)>> 1 44          であれば(wtz [中間] .W == X)戻る途中に、
45          他の 場合(wtz [中間] .W <X)L =ミッド+ 1 46          他の 場合(wtz [中間] .W> X)R = ミッド。
47      }
 48台の     リターン半ば;
49  }
 50  ボイドプリント(int型のx、int型LEN){
 51      CHAR S [ 1 <<(MAXN >> 1 )]。
52      のためにint型 I = 0 ; iがLEN <I ++は{)
 53の          S [I] = X%2 54          X / =2 ;
55      }
 56      のためにINT I = len- 1 ; I; i-- 57          ライト(S [I])。
58  }
 59  ボイドが解決(){
 60      のLL N2 = N / 2 61      のためには、int型 iは= 0 ; iは< 1 << N2; iは++ ){
 62          のLL SW = 0 63          のためにINT J = 0 ; J <N2; J ++ 64              であれば(I >> J&1 65                  SW + = A [J]。
66          wtz [I] .W = SW。
67          wtz [I]のBIT = I。
68      }
 69   
70      ソート(wtz、wtz +(1つの << N 2)、CMP)。
71   
72      のためにint型 i = 0 ; iは< 1 <<(N-N2); iは++ ){
 73          のLL SW = 0 74          のためにINT J = 0 ; J <N-N2; J ++ 75              であれば(I >> J&1 76                 SW + = [N 2 +のJ]。
77          であれば(SW <= S){
 78  //             デバッグ。
79              見出さLLのPOS =(0、(1つの << N 2)、S- SW)。
80  //             COUT << wtz [POS] .W << ENDL。
81              であれば(wtz [POS] .W + SW == S){
 82                  INT S [ 40 ]。
83                  のためのint型のk = 0 kは++; N <K 84の                      S [K] = 0 ;
85                  のためのint型 K =0 ; K <N2; ++ k個){
 86                      であれば((wtz [POS]のBIT >> K&1 ))
 87の                          S [K] = 1 88                  }
 89                  のためにINT K = 0、K <N-N2あり、k ++ ){
 90                      であれば(I >> K&1 91の                          S [N 2 + K] = 1 92                  }
 93                  のためのint型のk = 0 kは++; N <K 94                      ライト(S [K])。
95                 PN;
96                  リターン;
97              }
 98          }
 99      }
 100  }
 101  INT メイン()
 102  {
 103  //     の#defineローカル
104      ローカルの#ifdef
 105          FRE1。
106  //         fre2。
107      #endifの // ローカル
108      リード(N)、(S)読み取ります。
109      のためには、int型 i = 0 ; iがn <; iは++ 110          リード([I])。
111     解決する();
112      戻り 0 ;
113 }
ここにコード!

 

おすすめ

転載: www.cnblogs.com/wuliking/p/11360279.html