php回溯算法计算组合总和的实例代码 给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candidates 中的每个数字在每个组合中只能使用一次. 说明 所有数字(包括目标数)都是正整数. 解集不能包含重复的组
给定一个数组 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回溯算法计算组合总和的实例代码


基础教程推荐
猜你喜欢
- PHP数据加密方式梳理介绍 2023-07-03
- TP5 连接多个数据库及使用方法 2023-08-30
- php中使用array_filter()函数过滤数组实例讲解 2023-05-19
- TP5(thinkPHP5框架)基于bootstrap实现的单图上传插件用法示例 2023-01-19
- PHP删除数组中指定值的元素常用方法实例分析【4种方法】 2022-11-12
- PHP实现创建一个RPC服务操作示例 2023-04-01
- PHP实现生成数据字典功能示例 2022-10-18
- thinkPHP3.2.2框架行为扩展及demo示例 2022-11-07
- PHP使用SMTP邮件服务器发送邮件示例 2022-11-16
- laravel model模型定义实现开启自动管理时间created_at,updated_at 2023-03-02