タイトル
アレイは、両方のサブセット内の要素の総和が等しくなるように2つのサブセットに分割することができる場合にのみ正の整数を含む非空の配列を指定し、見つけます。
注意:
- アレイ素子の各々は、100を超えません。
- アレイのサイズは、200を超えません。
例1:
入力:[1、5、11、5] 出力:真の 説明:配列のように分割することができる[1、5,5]及び[11]。
例2:
入力:[1、2、3、5] 出力:偽 説明:配列が等しい和サブセットに分割することができません。
回答
1 クラスソリューション{ 2 公共: 3 BOOL canPartition(ベクトル< INT >&NUMS){ 4 int型 SUM =累算(nums.begin()、nums.end()、0); // 第1の加算アレイ 5。 IF( &SUM 1){ // 配列が奇数の場合、それが保持していない、なぜなら例えば:. 3 5 + 2 = 6。 復帰 はfalse ; 7 } 。8 INTハーフ= SUM / 2 ; 9 STD ::並べ替え(nums.begin()、NUMS .END()、グレーターSTD :: < 整数 >()); //そうでない場合は超過回数制限時間、添加しなければならない 10 の戻り FOO(NUMS、半分、0); //は入力の半分であろう 。11 } 12である 13である BOOLの FOO(ベクトル< INT > NUMSと、INT半分、int型のインデックス){ 14 のために(INTインデックス= I; Iは++){; Iはnums.size()< // あらゆる数の反復 15 INT H =半- NUMS [I]; // 半分差し引く 16を IF(H < 0)リターン 偽にする; 17。 IF(Hの== 0)戻り trueに、 18である // 上記の条件が満たされない場合、NUMSを説明[I]、番号を探し続ける必要次に、条件を満たすことができない
20 //すなわち指数= I + 1。真満たしていること、それはトップへの復帰を満たしていない場合、この層内の数字は、探しています。 19 IF(FOO(NUMS、H、私は+ 1。)== trueに)戻り trueに、 20である } 21で 返す falseに、 22である } 23です }。