我一直在寻找一段时间来尝试找到某种解决方案来解决目前阻碍我正在尝试完成的任务的问题。 我在其他编程语言中遇到过一些我无法理解的解决方案,尽管我试图这样做。我也看到了很多关于这个问题的术语,比如排列,重构,子集和,一元钱币等等。
如果我的方法不对,请随时告诉我。
简而言之,这就是问题所在:
给定一组(数组)数字,
例如:2, 3, 7, 14
,
我怎么能找到这些数字的组合加起来(或等于)一个特定的总和,例如:14
。
以上示例数字的一些潜在组合的示例:
3 + 3 + 3 + 3 + 2
7 + 3 + 2 + 2
7 + 7
14
由于我试图解决的问题是 PHP ,如果有一种可以用该语言提供的解决方案,我很乐意。如果没有,即使有人能够更好地解释我正在努力解决的问题,以及这样做的潜在方法,我将非常感激。
或者,如果我可能以错误的方式解决这个问题,我会全力以赴。
答案 0 :(得分:2)
根据amit的反馈和示例以及其他一些示例,这是我迄今为止设法提出的内容。 到目前为止似乎有效 - 但我不是百分之百确定。
$totals = array();
$x=0;
function getAllCombinations($ind, $denom, $n, $vals=array()){
global $totals, $x;
if ($n == 0){
foreach ($vals as $key => $qty){
for(; $qty>0; $qty--){
$totals[$x][] = $denom[$key];
}
}
$x++;
return;
}
if ($ind == count($denom)) return;
$currdenom = $denom[$ind];
for ($i=0;$i<=($n/$currdenom);$i++){
$vals[$ind] = $i;
getAllCombinations($ind+1,$denom,$n-($i*$currdenom),$vals);
}
}
$array = array(3, 5, 7, 14);
$sum = 30;
getAllCombinations(0, $array, $sum);
var_dump($totals);
答案 1 :(得分:1)
要生成所有解决方案,您将需要使用某种回溯,&#34;猜测&#34;如果第一个数字在解决方案中是否存在,并为每种可能性递归(需要对结果求和,或者不是)。
类似下面的伪代码:
genResults(array, sum, currentResult):
if (sum == 0): //stop clause, found a series summing to to correct number
print currentResult
else if (sum < 0): //failing stop clause, passed the required number
return
else if (array.length == 0): //failing stop clause, exhausted the array
return
else:
//find all solutions reachable while using the first number (can use it multiple times)
currentResult.addLast(array[0])
genResults(array, sum - array[0], currentResult)
//clean up
currentResult.removeLast()
//find all solutions reachable while NOT using first number
genResults(array+1, sum, currentResult)
//in the above array+1 means the subarray starting from the 2nd element