質問は、表面:P1466コレクションのサブセットの和を
ソリューション:
DP
SUM = N *(N + 1)/ 2は、
宇宙プログラムの数の和/ 2を満たすのに必要な数から選択した番号へのモデル、バックパックそれは
応答がない場合、それは見かけの合計%2 = 0!レイアウト判断
F. [i] [j]が前面に番号iを示し、jに対するプログラム番号
F. [0] [0] = 1;
F. [i]は[J] + = F. [JI [1-I] (J> = I)
への変換
(INT I = 1; Iは<= N; I ++)用の
ための(INT J = SUM / 2; J> = I; J)
F. [J] + = F. [JI ];
答えはFである[合計/ 2] / 2 、 要求の本当の主題はまあ分割することであるので、あなたは、再びあなたはもちろんおよびBを入れて選出されたことを書くには、/ 2アップを入れています。。
とにかく、これは
コード:
1の#include <cstdioを> 2 の#define長い長い年 3 使用 NamespaceZのSTDを。 4 CONST INT MAXN = 45 = MAXN *(1 + MAXN)/ 2 。 5 int型Nロール週間。 6 / II F [ 2 ]。 8、7 INT メイン(){ scanf関数(" %のD "、&N)。 9 和= N *(N + 1)/ 2 。 もし10和(の%2 ){ 11 printf(" 0 \ N " ); 12 リターン 0 ; 13 } 14 HF =和/ 2 。 15 F [ 0 ] = 1 。 16 のために(int型 i = 1 ; iが<= Nを; iが++ ) 17 のための(INT J = HF; J> = I; j-- ) 18 F [J] + = F [J- I]; 19 のprintf(" %LLDする\ n "、F [HF] / 2 )。 20 リターン 0 ; 21 }
で:AlenaNuna