找出x个整数的组合以求和给定的数字

时间:2014-02-19 18:10:10

标签: php

我试图找出如何循环出x个整数的可能组合来总结一个特定的数字。

让我们说,我有7号,我需要弄清楚如何用成对3中的整数来加总这个数字。 1 + 2 + 4 = 7

3 + 3 + 1 = 7

5 + 1 + 1 = 7

2 + 2 + 3 = 7

重复的数字组合对我不感兴趣,例如:

1 + 2 + 4 = 7

2 + 4 + 1 = 7

4 + 2 + 1 = 7

任何人都对我应该如何达到这个结果有任何想法? 感谢。

3 个答案:

答案 0 :(得分:0)

你可以试试这个算法

$ans = array();
for($i=1;$i<=5;$i++)
{
    $i1 = 7-$i;
    $i2 = intval($i1 - $i);
    $value = $i."+".$i1."+".$i2;
    $ans = array_unshift($ans,$value);
}

print_r($ans);

希望这会有所帮助。请告诉我

答案 1 :(得分:0)

以下是您的问题的解决方案。

function printPartitions($target, $max, $s){
    if($target === 0 )
        echo $s;
    else
        {
            if($max > 1)
            {
                printPartitions($target, $max-1, $s);
            }
            if($max <= $target)
            {
                printPartitions($target-$max, $max, $max . " " . $s);
            }
        }
}

printPartitions(5, 5, "<br/>");

您必须指定$ target Value,$ max value。

e.g。

printPartitions(7, 7, "<br/>");

它会为您提供如下输出:

1 1 1 1 1 1 1 
1 1 1 1 1 2 
1 1 1 2 2 
1 2 2 2 
1 1 1 1 3 
1 1 2 3 
2 2 3 
1 3 3 
1 1 1 4 
1 2 4 
3 4 
1 1 5 
2 5 
1 6 
7 

答案 2 :(得分:0)

我已经解决了我的问题。如果有人需要,我觉得我应该在这里默默分享。我的解决方案基于以下帖子:https://stackoverflow.com/a/19067884/3293843

<?php
function sampling($chars, $size, $combinations = array()) {
    # if it's the first iteration, the first set 
    # of combinations is the same as the set of characters
    if (empty($combinations)) {
        $combinations = $chars;
    }

    # we're done if we're at size 1
    if ($size == 1) {
        return $combinations;
    }

    # initialise array to put new values in
    $new_combinations = array();

    # loop through existing combinations and character set to create strings
    foreach ($combinations as $combination) {
        foreach ($chars as $char) {
            $new_combinations[] = $combination .'@'. $char;
        }
    }

    # call same function again for the next iteration
    return sampling($chars, $size - 1, $new_combinations);

}

// example
$chars = array('1', '2', '3','4');
$target = 7;
$maxLengthOfIntegers = 3;
$output = sampling($chars, $maxLengthOfIntegers);
$repeatedEntries = array();


//presenting the output
foreach($output as $out){
    $explodeOut = explode('@',$out);
    sort($explodeOut);
    if(array_sum($explodeOut) == $target){
        $sortedPattern = implode('',$explodeOut);
        if(!in_array($sortedPattern,$repeatedEntries)){
            echo $sortedPattern.'<br/>';
            $repeatedEntries[] = $sortedPattern;
            }
        }
    }
?>

感谢您的时间和精力。

此致 雅各布