找到x个数的所有组合,它们总和为Y.

时间:2017-09-30 09:20:23

标签: php recursion

我正在尝试用PHP编写这个解决方案。

输入:

number of numbers = x
smallest number = 1
sum of numbers = y

我没有处理非常大的数字,最大的x大约是50,最大的y大约是80。

规则:在每组数字中,前一个数字必须等于或大于。

例如

x = 3
min = 1
y = 6

溶液: (1,1,4-),(1,2,3)

请注意,(3,2,1)不是解决方案,因为它们按降序排列。

1 个答案:

答案 0 :(得分:0)

这可以通过递归轻松解决。时间复杂度虽然很高。为了更好(但稍微复杂一点的解决方案),使用动态编程。

以下是这个想法:

如果集合的大小为1,则唯一可能的解决方案是所需的总和。

如果集合大于1,那么您可以将最小值和所需总和之间的数字X与一组数字合并,这些数字相加所需的总和减去X.

function tuplesThatSumUpTo($desiredSum, $minimumNumber, $setSize) {
      $tuples = [];  
      if ($setSize <= 1) {
          return [ [ $desiredSum ] ]; //A set of sets of size 1 e.g. a set of the desired sum
      }
      for ($i = $minimumNumber;$i < $desiredSum;$i++) {
          $partial = tuplesThatSumUpTo($desiredSum-$i, $minimumNumber,$setSize-1); 
          $tuples = array_merge($tuples, array_map(function ($tuple) use ($i) {
              $res = array_merge([$i], $tuple);          
              sort($res);
              return $res;
          },$partial));
      }
      return array_unique($tuples,SORT_REGULAR);
}

看到它运行:

http://sandbox.onlinephpfunctions.com/code/1b0e507f8c2fcf06f4598005bf87ee98ad2505b3

动态编程方法可让您使用部分总和来保存一组数组,并返回它以填写您稍后需要的内容。