我正在尝试用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)不是解决方案,因为它们按降序排列。
答案 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
动态编程方法可让您使用部分总和来保存一组数组,并返回它以填写您稍后需要的内容。