2010-07-09 59 views
3

我有兩個項目,A和B.每次只能有最多2個項目。這導致以下組合:使用PHP計算最大數量和拆分組的挑戰

A B 
1 0 
2 0 
0 1 
0 2 
1 1 

如果您想要3個或更多項目,剩餘部分會溢出到新的集合中。 2組的集合優於集合中的單個項目。實例:

  • 2批次A和1個批次B(總3項)。將2臺:2 0,0 1 OR 1 1,1個0
  • 3批A和4對大量的B(共7項)將是4組:2 0,1 0,0 2,0 2或1 1,1 1,1 1,0 1 ...

什麼PHP代碼將是最有效的計算:

  • 組合中的每組
  • 套總數
  • 所有變化

樣品:

//input 
$a = 2; 
$b = 1; 
$totalItems = $a + $b; 
$totalSets = ceil($totalItems/2); 
$maxPerSet = 2; 

//split into sets of $maxPerSet 
for($i = 0; $i < $totalSets; $i ++) { 
    //calculate combinations of $a and $b 
    //? code goes here... 
    if($a >= $maxPerSet){ 
     $setA = $maxPerSet; $setB = 0; $a = $a - $maxPerSet; 

    } else if($b >= $maxPerSet){ 
     $setB = $maxPerSet; $setA = 0; $b = $b - $maxPerSet; 

    } else { 
     if($a + $b > $maxPerSet){ 
      $setA = $a; 
      $setB = $b - ($a-$maxPerSet); //not right! 
      $a = 0; 
     } else { 
      $setA = $a; $a = 0; $setB = $b; $b = 0; 
     } 
    } 

    //add to array of sets 
    $sets[$i] = "$setA $setB"; 
} 

//ouput 
print_r $sets; 
+4

我發現很難看到你想要完成什麼。你能澄清和/或提供樣本輸入和期望的輸出嗎? – 2010-07-09 02:17:52

+0

也許你需要澄清你的問題 – 2010-07-22 01:09:03

回答

1

這些都是要找到所有組合的一些注意事項:

首先找到所有組合才達到較大兩類(A或B)減1或2項;應該很容易計算1和2的可能數量,然後列舉它們的位置(組合I)。

10 = 2 + 2 + 2 + 2 + 2或1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1或2 + 2 + 2 + 1 + 1 + 1 + 1

然後您可以添加其他類別的金額。每組2個已滿,每組1個可能或不可能有另一個附加。擁有所有這樣的組合II(2對於每組1),可以計算出有多少較小的類別丟失。消除包含太多第二類的組合II

最後,每個組合II中缺少物品的數量必須填滿 - 使用0/1或0/2組。這與上面的問題相同。由於金額較小,緩存可能會提高性能。因此,對於每個組合II,您可以列舉出缺失項目的組合,最後得到您正在查找的組合III

合:

  1. 可能的量的1(1/0)和2(2/0) - 設置才達到較大categorie的(例如A的)量 I. 1/0的系統改組和2/0 二。每個1/0 - > 1/0或1/1兩種可能的組合 - 以及不可能的組合的消除II III。缺少一定數量的可能組合(例如)B就像我

但是,解決難題與PHP沒有太大的關係。關於性能,它在數量上取決於系統。緩存可能會提高某些組合的性能,並降低其他組合的性能。當然,上面的算法建議有很大的優化空間。