首页 > 解决方案 > 使用 PHP 查找所有子集总和和组合总和

问题描述

我有这些列表
Level 2 = 23
Level 3 = 34
Level 4 = 45
Level 5 = 56
Level 6 = 68
Level 7 = 79
Level 8 = 90
Level 9 = 101
Level 10 = 112
Level 11 = 123
Level 12 = 134
Level 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


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

以及我如何将“10级”和“exp”这两个词组合到结果中,并像这样组合相同的子集(112)

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

标签: phparrayssumsubsetcombinations

解决方案


推荐阅读