• 技术文章 >后端开发 >PHP问题

    PHP如何使用回溯算法计算组合总和

    醉折花枝作酒筹醉折花枝作酒筹2021-07-13 15:16:59原创85
    给定一个数组candidates和一个目标数target,找出candidates中所有可以使数字和为target的组合。这时候我们应该怎么做?今天小编带大家了解一下。

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

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

    说明:

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

    示例 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如何使用回溯算法计算组合总和的详细内容,更多请关注php中文网其它相关文章!

    声明:本文原创发布php中文网,转载请注明出处,感谢您的尊重!如有疑问,请联系admin@php.cn处理
    专题推荐:PHP
    上一篇:php怎么设置文件大小限制 下一篇:php怎么给数组增加值
    第16期线上培训班

    相关文章推荐

    • php怎么增加一条数据代码• php禁止输出错误的方法是什么• 带大家学习PHP中的文件系统函数(一)• 关于PhpStorm中如何绘画UML的解析• php怎么设置文件大小限制

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网