PHP数组非空数字组合求和的合适算法求助
解决PHP数组非空数字组合求和问题
我来帮你搞定这个问题!你的现有代码主要有两个问题:一是$test变量没有在每次外层循环时重置,导致累加了之前的计算结果;二是没有排除空组合(也就是和为0的情况,这不是你需要的非空组合)。
下面是修正并优化后的代码,完全匹配你的需求:
$nums = array(1, 2, 3); $numCount = count($nums); $totalCombinations = pow(2, $numCount); $result = []; // 用来存储最终所有组合和的数组 // 从i=1开始循环,直接跳过空组合(i=0对应无元素选中,和为0) for ($i = 1; $i < $totalCombinations; $i++) { $currentSum = 0; // 每次循环重置当前组合的和,避免累加 for ($j = 0; $j < $numCount; $j++) { // 检查二进制数i的第j位是否被设置(表示选中该元素) if (pow(2, $j) & $i) { $currentSum += $nums[$j]; } } $result[] = $currentSum; // 将当前组合的和存入结果数组 } // 输出示例1的结果:3,4,5,6 echo implode(',', $result);
代码逻辑说明
- 二进制位映射组合:用二进制数的每一位对应数组中的一个元素,比如
$i=3(二进制11)对应选中前两个元素,$i=7(二进制111)对应选中全部三个元素,以此类推。 - 跳过空组合:外层循环从
$i=1开始,因为$i=0时没有任何元素被选中,对应的和为0,不符合你要的非空组合要求。 - 独立计算每个组合:每次外层循环都重置
$currentSum为0,确保每个组合的和都是独立计算的,不会和之前的结果累加。
测试示例2
如果输入数组是array(1,2,3,4),运行上述代码后,$result数组的内容会是:[3,4,5,6,10,5,6,9,7],和你给出的示例2的计算结果完全一致。
如果你需要结果是有序的,只需要在存入数组后添加一行sort($result);,就能得到有序的结果:3,4,5,5,6,6,7,9,10。
内容的提问来源于stack exchange,提问作者user319940
相关产品推荐
相关产品推荐

