如何在PHP中找到所有N个单位数,非重复数字组合的总和?

Ter*_*ich 7 php puzzle math numbers subset-sum

假设我想找到所有5个单位数,非重复数的集合,最多可加30个...我最终会得到[9,8,7,5,1],[9,8,7] ,4,2],[9,8,6,4,3],[9,8,6,5,2],[9,7,6,5,3]和[8,7,6, 5,4].这些集合中的每一个都包含5个非重复数字,最多可加30,即给定的总和.

任何帮助将不胜感激.即使只是我使用的起点也会很棒.

我提出了一种方法,这似乎是一个很长的路要走:得到所有唯一的5位数字(12345,12346,12347等),加上数字,看它是否等于给定的总和(例如30).如果是,请将其添加到可能的匹配集列表中.

我这样做是为了个人项目,这将帮助我解决Kakuro难题,而不是立即解决整个问题.是的,它可能是作弊,但它......不是那么糟糕......:P

art*_*ung 1

function sumOfDigits($num) {
    $str = "{$num}";
    $sum = 0;
    for ($i=0;$i<strlen($str);$i++) {
        $sum += (int)substr($str, $i, 1);
    }
    return $sum;
}

function hasDuplicateDigits($num) {
    $str = "{$num}";
    $pieces = array();
    for ($i=0;$i<strlen($str);$i++) {
        $pieces[] = substr($str, $i, 1);
    }
    return (count(array_unique($pieces)) != strlen($str));
}

// if you prefer the opposite function
function hasAllUniqueDigits($num) {
    return (!hasDuplicateDigits($num));
}

$numbers = range(10000, 99999);

foreach ($numbers as $num) {
    if ( !hasDuplicateDigits($num) && (sumOfDigits($num) == 30)) {
        print $num . "\n";
    }
}
Run Code Online (Sandbox Code Playgroud)