PHP如何通过回溯算法巧妙计算组合总和,形成长尾词疑问?

2026-04-06 09:071阅读0评论SEO资讯
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1037个文字,预计阅读时间需要5分钟。

PHP如何通过回溯算法巧妙计算组合总和,形成长尾词疑问?

给定一个数组candidates和一个目标数target,找出candidates中所有可能的数字组合,使得它们的和等于target。

解决思路如下:

1. 使用回溯算法来遍历所有可能的组合。

2.从数组中的每个数字开始,尝试添加到当前组合中,并递归地继续搜索下一个数字。

3.如果当前组合的和超过了target,则停止搜索该路径。

4.如果当前组合的和等于target,则将当前组合添加到结果中。

5.回溯到上一步,尝试下一个可能的数字。

以下是实现该算法的代码示例:

python

def combinationSum2(candidates, target): def backtrack(start, path, target): if target==0: result.append(path) return if target start and candidates[i]==candidates[i - 1]: continue backtrack(i + 1, path + [candidates[i]], target - candidates[i])

result=[] candidates.sort() backtrack(0, [], target) return result

在这个例子中,我们首先对数组candidates进行排序,然后从索引0开始回溯。我们使用一个path列表来记录当前组合,并递归地搜索下一个可能的数字。当找到和为target的组合时,将其添加到结果列表中。最后,返回所有可能的组合。

给定一个数组candidates和一个目标数target,找出candidates中所有可以使数字和为target的组合。这时候我们应该怎么做?今天小编带大家了解一下。

给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。

candidates 中的每个数字在每个组合中只能使用一次。

说明:

PHP如何通过回溯算法巧妙计算组合总和,形成长尾词疑问?

所有数字(包括目标数)都是正整数。 解集不能包含重复的组合。

示例 1:

输入: candidates = [10,1,2,7,6,1,5], target = 8, 所求解集为:[ [1, 7], [1, 2, 5], [2, 6], [1, 1, 6]]

示例 2:

输入: candidates = [2,5,2,1,2], target = 5, 所求解集为:[ [1,2,2], [5]]

解题思路

直接参考 回溯算法团灭排列/组合/子集问题

代码

class Solution { /** * @param Integer[] $candidates * @param Integer $target * @return Integer[][] */ public $res = []; function combinationSum2($candidates, $target) { sort($candidates); // 排序 $this->dfs([], $candidates, $target, 0); return $this->res; } function dfs($array, $candidates, $target, $start) { if ($target < 0) return; if ($target === 0) { $this->res[] = $array; return; } $count = count($candidates); for ($i = $start; $i < $count; $i++) { if ($i !== $start && $candidates[$i] === $candidates[$i - 1]) continue; $array[] = $candidates[$i]; $this->dfs($array, $candidates, $target - $candidates[$i], $i + 1);//数字不能重复使用,需要+1 array_pop($array); } }}

额外:

给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。

candidates 中的数字可以无限制重复被选取。

区别是允许重复选择,在上一题基础上之改动了两处就搞定了。

class Solution { /** * @param Integer[] $candidates * @param Integer $target * @return Integer[][] */ public $res = []; function combinationSum($candidates, $target) { sort($candidates); // 排序 $this->dfs([], $candidates, $target, 0); return $this->res; } function dfs($array, $candidates, $target, $start) { if ($target < 0) return; if ($target === 0) { $this->res[] = $array; return; } $count = count($candidates); for ($i = $start; $i < $count; $i++) { // if ($i !== $start && $candidates[$i] === $candidates[$i - 1]) continue; // 注释掉去重的代码 $array[] = $candidates[$i]; $this->dfs($array, $candidates, $target - $candidates[$i], $i);//数字能重复使用, 不需要+1 array_pop($array); } }}

额外:

找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。

限制被选中方案中的元素数量

class Solution { public $res = []; /** * @param Integer $k * @param Integer $n * @return Integer[][] */ function combinationSum3($k, $n) { $this->dfs([], [1,2,3,4,5,6,7,8,9], $n, 0, $k); return $this->res; } function dfs($array, $candidates, $n, $start, $k) { if ($n < 0) return; if ($n === 0 && count($array) === $k) { $this->res[] = $array; return; } for ($i = $start; $i < 9; $i++) { if ($i !== $start && $candidates[$i] === $candidates[$i - 1]) continue; $array[] = $candidates[$i]; $this->dfs($array, $candidates, $n - $candidates[$i], $i + 1, $k); array_pop($array); } }}

推荐学习:php视频教程

以上就是PHP如何使用回溯算法计算组合总和的详细内容,更多请关注自由互联其它相关文章!

本文共计1037个文字,预计阅读时间需要5分钟。

PHP如何通过回溯算法巧妙计算组合总和,形成长尾词疑问?

给定一个数组candidates和一个目标数target,找出candidates中所有可能的数字组合,使得它们的和等于target。

解决思路如下:

1. 使用回溯算法来遍历所有可能的组合。

2.从数组中的每个数字开始,尝试添加到当前组合中,并递归地继续搜索下一个数字。

3.如果当前组合的和超过了target,则停止搜索该路径。

4.如果当前组合的和等于target,则将当前组合添加到结果中。

5.回溯到上一步,尝试下一个可能的数字。

以下是实现该算法的代码示例:

python

def combinationSum2(candidates, target): def backtrack(start, path, target): if target==0: result.append(path) return if target start and candidates[i]==candidates[i - 1]: continue backtrack(i + 1, path + [candidates[i]], target - candidates[i])

result=[] candidates.sort() backtrack(0, [], target) return result

在这个例子中,我们首先对数组candidates进行排序,然后从索引0开始回溯。我们使用一个path列表来记录当前组合,并递归地搜索下一个可能的数字。当找到和为target的组合时,将其添加到结果列表中。最后,返回所有可能的组合。

给定一个数组candidates和一个目标数target,找出candidates中所有可以使数字和为target的组合。这时候我们应该怎么做?今天小编带大家了解一下。

给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。

candidates 中的每个数字在每个组合中只能使用一次。

说明:

PHP如何通过回溯算法巧妙计算组合总和,形成长尾词疑问?

所有数字(包括目标数)都是正整数。 解集不能包含重复的组合。

示例 1:

输入: candidates = [10,1,2,7,6,1,5], target = 8, 所求解集为:[ [1, 7], [1, 2, 5], [2, 6], [1, 1, 6]]

示例 2:

输入: candidates = [2,5,2,1,2], target = 5, 所求解集为:[ [1,2,2], [5]]

解题思路

直接参考 回溯算法团灭排列/组合/子集问题

代码

class Solution { /** * @param Integer[] $candidates * @param Integer $target * @return Integer[][] */ public $res = []; function combinationSum2($candidates, $target) { sort($candidates); // 排序 $this->dfs([], $candidates, $target, 0); return $this->res; } function dfs($array, $candidates, $target, $start) { if ($target < 0) return; if ($target === 0) { $this->res[] = $array; return; } $count = count($candidates); for ($i = $start; $i < $count; $i++) { if ($i !== $start && $candidates[$i] === $candidates[$i - 1]) continue; $array[] = $candidates[$i]; $this->dfs($array, $candidates, $target - $candidates[$i], $i + 1);//数字不能重复使用,需要+1 array_pop($array); } }}

额外:

给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。

candidates 中的数字可以无限制重复被选取。

区别是允许重复选择,在上一题基础上之改动了两处就搞定了。

class Solution { /** * @param Integer[] $candidates * @param Integer $target * @return Integer[][] */ public $res = []; function combinationSum($candidates, $target) { sort($candidates); // 排序 $this->dfs([], $candidates, $target, 0); return $this->res; } function dfs($array, $candidates, $target, $start) { if ($target < 0) return; if ($target === 0) { $this->res[] = $array; return; } $count = count($candidates); for ($i = $start; $i < $count; $i++) { // if ($i !== $start && $candidates[$i] === $candidates[$i - 1]) continue; // 注释掉去重的代码 $array[] = $candidates[$i]; $this->dfs($array, $candidates, $target - $candidates[$i], $i);//数字能重复使用, 不需要+1 array_pop($array); } }}

额外:

找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。

限制被选中方案中的元素数量

class Solution { public $res = []; /** * @param Integer $k * @param Integer $n * @return Integer[][] */ function combinationSum3($k, $n) { $this->dfs([], [1,2,3,4,5,6,7,8,9], $n, 0, $k); return $this->res; } function dfs($array, $candidates, $n, $start, $k) { if ($n < 0) return; if ($n === 0 && count($array) === $k) { $this->res[] = $array; return; } for ($i = $start; $i < 9; $i++) { if ($i !== $start && $candidates[$i] === $candidates[$i - 1]) continue; $array[] = $candidates[$i]; $this->dfs($array, $candidates, $n - $candidates[$i], $i + 1, $k); array_pop($array); } }}

推荐学习:php视频教程

以上就是PHP如何使用回溯算法计算组合总和的详细内容,更多请关注自由互联其它相关文章!