在本篇文章里小编给大家整理的是一篇关于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);}}
实例扩展:
<?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);?>
相关推荐
© 2020 asciim码
人生就是一场修行