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);//数字不能重复使用,需要+1 array_pop($array); }}
实例扩展:
<?php /* * k = 2x + y + 1/2z 取值范围 * 0 <= x <= 1/2k * 0 <= y <= k * 0 <= z < = 2k * x,y,z最大值 2k */ $daMi = 100; $result = array(); function isOk($t,$daMi,$result) {/*{{{*/ $total = 0; $hash = array(); $hash[1] = 2; $hash[2] = 1; $hash[3] = 0.5; for($i=1;$i<=$t;$i++) { $total += $result[$i] * $hash[$i]; } if( $total <= $daMi) { return true; } return false; }/*}}}*/ function backtrack($t,$daMi,$result) {/*{{{*/ //递归出口 if($t > 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中怎么利用回溯算法计算组合总和问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注亿速云行业资讯频道了解更多相关知识。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。