質問は、表面:SP11469サブセット-バランス牛のサブセットを
ソリューション:
集合Aに属する、またはBの集合に属するいずれかの任意の数のために、選択された又はされていません。上記3つのケースに3つの係数1、-1、0に対応して設けられ、その後、対象変換
二組と0を見つけるには、答えのための非繰り返しのこれら二つのセットをマージします。バイナリ検索を考えてみましょう。前半と後半、ハッシュテーブルと圧縮された状態の記録を押収
そして、ディエンファシス、その後、統計への答え。
時間計算量はO(6 ^(N / 2))です。
コード:
1つの#include <cstdioを> 2 使用して 名前空間STDを、 3 のconst int型 MAXN = 25、MOD = 230203、MAX_NUM = 6E4。 4 整数 N、M [MAXN]、NUM = 0、ANS = 0、NX [MAX_NUM]、HD [MOD + 50 ]。 5 INT のTmp [MAX_NUM]、合計[MAX_NUM]、HF、PS。 6 BOOL VIS [ 1050 ] [ 1050 ]。 7インラインボイド挿入(INT TMP、INT 合計){ 8 PS =(和%MOD + MOD)%MOD。 9 用(int型 ; I I = I = HD [PS] NX [i])と 10 であれば(TMP [I] == TMP &&合計[I] ==和)のリターン ; // 11 NX [++ NUM] = HD [PS]。 12 のTmp [NUM] = TMP。 13 合計[NUM] = 合計。 14 HD [PS] = NUM。 15 リターン; 16 } 17インラインINT(検索INT TMP、INT 合計){ 18 、PS =(和%MOD + MOD)%MODと、 19 INT ANS = 0 。 20 用(INT I = HD [PS]; I; I = NX [i])と 21 であれば(SUM [I] ==和&& VIS [Tmpの[I] [TMP] == 0 ){ 22 VIS [Tmpの[ I] [TMP] = 1 。 23の ANS ++ ; 24 } 25の リターンANS。 26 } 27インラインボイド DFS1(INT TP、INT和、INT TMP){ 28 であれば(TP> HF){ 29 インサート(TMP、合計)。 30 リターン; 31 } 32 DFS1(TP + 1、和+ M [TP]、TMP << 1 | 1 )。 33 DFS1(TP + 1、和M [TP]、TMP << 1 | 1 )。 34 DFS1(TP + 1、和、TMP << 1 )。 35 リターン; 36 } 37インラインボイド DFS2(INT TP、INT和、INT TMP){ 38 であれば(TP> N){ 39の ANSは+ =(TMP、 -検索和)。 40 リターン; 41 } 42 DFS2(TP + 1、和+ M [TP]、TMP << 1 | 1 )。 43 DFS2(TP + 1、和M [TP]、TMP << 1 | 1 )。 44 DFS2(TP + 1、和、TMP << 1 )。 45 リターン; 46 } 47 INT メイン(){ 48 のscanf(" %dの"、&N)。 49 HF = N >> 1 。 50 のために(int型 I = 1のscanf(; iが= Nを<I ++)は、「%dの"& M [I]); 51 DFS1(1、0、0 ); 52 DFS2(HF + 1、0、0 ); 53 のprintf(" %d個の\ n "、ans- 1 ); 54 リターン 0 ; 55 }
で:AlenaNuna