2015-11-18 30 views
2

假設我有數組:我怎麼能拆的數字陣列均勻

array(1,1,2,1,4,5,7,2,3); 

會是什麼讓這些數字變成X陣列,我們將使用3和衆多的人數是作爲平等的最快方法儘可能在更大的數字結束?

例子:

array(1, 1, 1, 5); 
array(7, 2); 
array(4, 2, 3); 

我很擔心,這可能是一個P = NP問題,但它似乎很簡單,它不應該是。我似乎無法弄清楚。

類似的問題:Algorithm to split an array into P subarrays of balanced sum

+0

什麼是你出的基礎投入。?你怎麼寫它? –

+2

你是什麼意思_最後的數字越大_? – AbraCadaver

+0

第一個數組中的數字總數爲26,因此應該有兩個總數爲9和8中的一個,這是我輸出的基礎。我不知道如何有效實現這個效果 – Blakethepatton

回答

1

你正在尋找不完全是,但是這應該幫助你開始:

$array = array(1,1,2,1,4,5,7,2,3); 

asort($array); 

$total = array_sum($array); 

$array1 = array(); 
$array2 = array(); 
$array3 = array(); 

foreach($array as $number) { 
    if(array_sum($array1) < round($total/3)) { 
     array_push($array1, $number); 
    } elseif(array_sum($array2) < round($total/3)) { 
     array_push($array2, $number); 
    } else { 
     array_push($array3, $number); 
    } 
} 

for($i = 1; $i <= 3; $i++) { 

    switch($i) { 
     case 1: 
      $op1 = 2; 
      $op2 = 1; 
      break; 
     case 2: 
      $op1 = -1; 
      $op2 = 1; 
      break; 
     case 3: 
      $op1 = -2; 
      $op2 = -1; 
      break; 
    } 

    foreach(${'array' . $i} as $number) { 
     if((array_sum(${'array' . ($i + $op1)}) + $number) == round($total/3)) { 
      unset(${'array' . $i}[array_search($number, ${'array' . $i})]); 
      array_push(${'array' . ($i + $op1)}, $number); 
     } elseif((array_sum(${'array' . ($i + $op2)}) + $number) == round($total/3)) { 
      unset(${'array' . $i}[array_search($number, ${'array' . $i})]); 
      array_push(${'array' . ($i + $op2)}, $number); 
     } 
    } 
} 

print_r($array1); 
print_r($array2); 
print_r($array3); 

新輸出:

​​
+1

這與我正在尋找的東西非常接近。 – Blakethepatton

+0

增加了一些更多的排序以獲得所需的結果。 – mattslone

2

從本質上講,你可以使用array_slice剝離出你所需要的塊和asort到陣列從最小到最大排序第一。

下面的代碼將這樣的伎倆:

(編輯:最近的評論我很困惑之後,你說你想要的數組中的數字的總和是接近相同的我還以爲你的意思是你想要的陣列在尺寸上平分不是總和)

$arr = array(1,1,2,1,4,5,7,2,3); 
asort($arr); // sort the array 

$x = 3; // number of arrays 
$offset = ceil(count($arr)/$x); 

$newArrays = array(); 
for($i=0;$i<=count($arr)-1;$i+=$offset) { 
    $newArrays[] = array_slice($arr,$i,$offset); 
} 

var_dump($newArrays); 

結果:

array(3) { 
    [0]=> 
    array(3) { 
    [0]=> 
    int(1) 
    [1]=> 
    int(1) 
    [2]=> 
    int(1) 
    } 
    [1]=> 
    array(3) { 
    [0]=> 
    int(2) 
    [1]=> 
    int(2) 
    [2]=> 
    int(3) 
    } 
    [2]=> 
    array(3) { 
    [0]=> 
    int(4) 
    [1]=> 
    int(5) 
    [2]=> 
    int(7) 
    } 
} 
+2

相同的用戶在幾個小時前問同樣的問題,當我想要回答問題時,問題被刪除了...無論如何,除了我們可以使用'array_chunk($ array,$ offset); for循環。 :) –

+0

我實際上試圖得到它,以便數組1-3有相似的總數。對不起,因爲「最後有更大的數字」而感到困惑。我的意思是,總共有26個,你會有兩個數組,總數爲9,總數爲8。我希望輸出的方式是陣列1的總數爲8,陣列2和3的總數爲9 – Blakethepatton

+0

均勻分割。我試圖將一個數組拆分爲平衡總和的P子數組。 IE每個子宮有大約相同的總數。 – Blakethepatton