2012-04-04 107 views
1

下面的代碼將爲您在有四個不同變量時可能發生的所有可能組合創建一個數組。變量總是需要等於1.我創建的for循環工作,我理解如何使這個工作更多的變量,但我可以使這種動態?我需要一個具有多少變量作爲參數的函數。如果有三個變量創建三個forloops。如果有10個...創建10個相應的循環來確定所有可能的組合。爲所有潛在組合創建動態循環PHP函數

$anarray2 = array(); 
for($a = 1; $a <= 97; $a++) { 
    for($b = 1; $a + $b <=98 ; $b++) { 
    for($c = 1; $a + $b + $c <= 99; $c++) { 
     $d = 100 - ($a + $b + $c); 
     $var_1 = $a/100; 
     $var_2 = $b/100; 
     $var_3 = $c/100; 
     $var_4 = $d/100; 
     $anarray2[] = array($var_1, $var_2, $var_3, $var_4); 
    } 
    } 
} 
print_array($anarray2); 
+0

您是在尋找* cartesian產品*算法嗎?那裏已經有很多了...... – deceze 2012-04-04 02:16:03

+0

你能給我提供一個例子的鏈接嗎?我從來沒有聽說過這個....時間到谷歌。 – 2012-04-04 03:07:06

+0

從這裏開始:http://stackoverflow.com/search?q=%5Bphp%5D+cartesian+product+algorithm – deceze 2012-04-04 03:14:22

回答

0

你尋找有效共享出來I相同項目N人在所有不同的可能途徑。

如果有一個人(N==1),那麼只有一種方法可以做到這一點 - 給該人全部I項目。

如果有多於一個人(N>1),那麼我們可以考慮可以爲第一人分配多少物品,然後在每種情況下剩餘的N-1人可以分配多少物品。

這導致了一個很好的遞歸解決方案。首先,我們解決問題的N=1

function assign($I, $N) { 
    $anarray = array(); 

    if ($N == 1) { 
     $anarray[] = array($I); 
    } else { 
     // Coming up... 
    } 

return $anarray; 
} 

現在,我們解決的N=k-1條款N=k問題(一些常數) - 也就是我們解決使用該解決方案,以更小的問題的問題。當N=1時,這將一路回到解決方案。

function assign($I, $N) { 
    $anarray = array(); 

    if ($N == 1) { 
     $anarray[] = array($I); 
    } else { 
     for ($i = $I; $i < $I; $i++) { 
      foreach (assign($I - $i, $N - 1) as $subproblem) { 
       $anarray[] = array_merge(array($i), $subproblem); 
      } 
     } 
    } 

    return $anarray; 
}  

這樣的事情應該可以完成這項工作。