1 <?php 2 /** 3 *一個整數數組,長度為n,將其分為m 份,使各份的和相等,求m 的最大值 4 *比如{3,2,4,3,6} 可以分成{3,2,4,3,6} m=1; 5 *{3,6}{2,4,3} m=2 6 *{3,3}{2,4}{6} m=3 所以m 的最大值為3 7 **/ 8 9 #解題思路10 #首先m必須滿足兩個條件11 #1. 1<=m<=n12 #2. sum(a) % m = 0,即sum(a)必須是m的倍數,其中a為待切分數組13 #解題步驟:14 #1. m從n開始,依次減小15 #2. 判斷m是否能滿足題目條件,如滿足,則返回m以及分組資訊16 #對於判斷m是否能滿足條件,使用輔助數組group_info[]17 #其中group_info[i]=k表示a[i]被分配到第k組18 19 function maxm($a) {20 $len = count($a);21 $asum = 0;22 for ($i = 0; $i < $len; $i++) $asum += $a[$i];23 24 #25 for ($m = $len; $m >= 2; $m--) {26 if ($asum % $m != 0) continue;27 $group_info = array(); #分組資訊28 for ($i = 0; $i < $len; $i++) $group_info[$i] = 0;29 if (test($a, $m, $asum, $group_info, $asum / $m, 1)) 30 return array("m" => $m, "group_info" => $group_info);31 }32 33 return array("m"=> 1);34 }35 36 function test($a, $m, $asum, &$group_info, $goal, $group_id) {37 $len = count($a);38 $msum = $asum / $m;39 40 if ($goal == 0) {41 $group_id++;42 $goal = $msum;43 #所有分組分配結束44 if ($group_id == $m + 1) return true;45 } else if ($goal < 0) {46 return false;47 }48 #將數組分組,並判斷是否能滿足條件49 for ($i = 0; $i < $len; $i++) {50 #跳過已指派元素51 if ($group_info[$i] != 0) continue;52 $group_info[$i] = $group_id;53 #分配完a[i]繼續往下分配54 if (test($a, $m, $asum, $group_info, $goal - $a[$i], $group_id)) return true;55 #a[i]分配失敗,重新置為056 $group_info[$i] = 0;57 }58 59 return false;60 }61 62 $a = array(3, 2, 4, 3, 6, 2, 2, 2);63 print_r(maxm($a));64 ?>