php回溯算法计算组合总和的实例代码
给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
candidates 中的每个数字在每个组合中只能使用一次。
说明
所有数字(包括目标数)都是正整数。 解集不能包含重复的组合。
实例
输入:
candidates = [10,1,2,7,6,1,5], target = 8,所求解集为:
[解题思路
[1, 7],
[1, 2, 5],
[2, 6],
[1, 1, 6]]
直接参考回溯算法团灭排列/组合/子集问题。
代码
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); //数字不能重复使用,需要+1array_pop($array); }}
实例扩展:
3) { //输出最优解 if($daMi == (2 * $result[1] + $result[2] + 0.5 * $result[3])) {echo "最优解,大米:${daMi},大牛:$result[1],中牛: $result[2],小牛:$result[3]\n"; } return; } for($i = 0; $i <= 2 * $daMi; $i++) { $result[$t] = $i; //剪枝 if(isOk($t,$daMi,$result)) {backtrack($t+1,$daMi,$result); } $result[$t] = 0; }}/*}}}*/backtrack(1,$daMi,$result); ?>
【php回溯算法计算组合总和的实例代码】到此这篇关于php回溯算法计算组合总和的实例代码的文章就介绍到这了,更多相关php回溯算法计算组合总和的方法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
推荐阅读
- 画解算法(1.|画解算法:1. 两数之和)
- Guava|Guava RateLimiter与限流算法
- thinkphp|thinkphp 3.2 如何调用第三方类库
- CGI,FastCGI,PHP-CGI与PHP-FPM
- 一个选择排序算法
- SG平滑轨迹算法的原理和实现
- 《算法》-图[有向图]
- LeetCode算法题-11.|LeetCode算法题-11. 盛最多水的容器(Swift)
- 虚拟DOM-Diff算法详解
- 《数据结构与算法之美》——队列