• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    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回溯算法计算组合总和的实例代码的文章就介绍到这了,更多相关php回溯算法计算组合总和的方法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    您可能感兴趣的文章:
    • PHP基于回溯算法解决n皇后问题的方法示例
    • PHP实现的回溯算法示例
    上一篇:PHP中信息格式化操作详解(MessageFormatter类)
    下一篇:PHP将amr音频文件转换为mp3格式的操作细节
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    php回溯算法计算组合总和的实例代码 php,回溯,算法,计算,组合,