You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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);

代码逻辑说明

  1. 二进制位映射组合:用二进制数的每一位对应数组中的一个元素,比如$i=3(二进制11)对应选中前两个元素,$i=7(二进制111)对应选中全部三个元素,以此类推。
  2. 跳过空组合:外层循环从$i=1开始,因为$i=0时没有任何元素被选中,对应的和为0,不符合你要的非空组合要求。
  3. 独立计算每个组合:每次外层循环都重置$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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:41:19