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

admin3年前PHP教程96

给定一个数组 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回溯算法计算组合总和的方法内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!

免责声明:本文内容来自用户上传并发布,站点仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。请核实广告和内容真实性,谨慎使用。

相关文章

Thinkphp6.0中间件的具体使用

目录全局中间件 应用中间件 路由中间件 控制器中间件 中间件传参 6.0中间件分为系统中间件和应用中间件,系统中间件为核心框架内置的中间件,应用中间件是在应用里面创建的中间件。中间件的主要应用场景可以...

香港拨号vps的价格受哪些因素影响

影响香港拨号vps价格的因素有:1、机房配置环境,服务商知名度越高,机房配置越好,香港拨号vps租用价格相对贵一些;2、香港拨号vps的配置,主机配置越高,价格越贵;3、香港拨号vps带宽配置,选择独...

深度学习类型的GPU服务器如何选择租用新加坡显卡服务器怎么购买

一、GPU服务器有什么作用?众所周知GPU加速计算可以提高应用程序的性能,可以把应用程序计算密集部分的工作负载转移到GPU,而CPU则运行其余程序代码,从用户的角度来看,应用程序的运行速度明显加快。我...

laravel数据库查询结果自动转数组修改实例

在项目中再次碰见laravel中从数据库中查询到的结果是对象,用toArray也不好用,之前改过一次,印象中是在/confing/database.php, 'fetch' =>...

高防服务器、高防ip和高防cdn三者有什么区别?国内电信100G高防服务器租用指南?

高防服务器主要是比普通服务器多了防护服务,一般都是在idc信息中心出口布署了专门的硬件防火墙设备以及流量清洗牵引设备等,用来防cc攻击和防ddos攻击。就目前的标准衡量,高防服务器是指能独立防护100...

香港拨号vps租用要注意哪些问题?

香港拨号vps租用要注意的问题有:1、选择优质的香港云服务商,看服务商的口碑和资质,好的服务商能提供优质的运维服务,能确保数据的安全;2、做好定期的数据备份和安全扫描,以防vps感染了病毒或木马后数据...