使用PHP查找所有子集总和和组合总和

时间:2019-09-02 06:46:09

标签: php arrays sum subset combinations

我有这些清单
2级= 23
3级= 34
4级= 45
5级= 56
6级= 68
7级= 79
8级= 90
9级= 101
10级= 112
11级= 123
12级= 134
13级= 145
14级= 156
15级= 168
16级= 179

每个关卡的数字用于数组查找所有可能的数字组合以达到给定的集合

我的代码

  index.html
  <html>  
    <body>  
    <form method="post" action="compute.php">  
      Current:  
     <input type="number" name="number1" />  
   <input  type="submit" name="submit" value="Compute">  
  </form> 
    </body>
  </html>

 compute.php
   <?php 

   $number1 = $_POST['number1']; 
   $limit =  100000-$number1;  

   $array = array (23,34,45,56,68,79,90,101,112,123,134,145,156,168,179);

   $array = array_filter($array, function($var) use ($limit) {
   return ($var <= $limit);
   });

    rsort($array);
  $num = count($array); 
  $total = pow(2, $num);
   $out = array();

   for ($i = 0; $i < $total; $i++) { 

$comb = array();
for ($j = 0; $j < $num; $j++) { 
   // is bit $j set in $i? 
    if (pow(2, $j) & $i){
      $comb[] = $array[$j];
    }      
} 

if (array_sum($comb) == $limit)
{
  $out[] = $comb;
}
}

 array_multisort(array_map('count', $out), SORT_ASC, $out);

  $out = array_unique($out, SORT_REGULAR);
$m = 1;
 foreach($out as $result) 

  echo "<b>Possible Answer ". $m++. " : </b> " .implode(', ', $result)." 
 <br><br>";


  ?>
  </div> 
  </div>

我的输入和输出

如果我输入99318
输出是这样的
可能的答案1:168,145,134,123,112
可能的答案2:168,156,134,123,101
可能的答案3:168、156、145、112、101


我的问题是我的代码无法找到组合数组,如果它的重复数字是这样的(112)
可能的答案:168、156、134、112、112


现在我很困惑如何查找和获取重复的数字

以及如何将单词“ Level 10”和“ exp”组合为结果并组合相同的子集(112)

可能的答案:15-168级,14-156级,10-134级,10(2x)-224级

0 个答案:

没有答案