php回溯算法计算组合总和的实例代码
发布:smiling 来源: PHP粉丝网 添加日期:2022-05-09 10:22:41 浏览: 评论:0
在本篇文章里小编给大家整理的是一篇关于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);
- ?>
Tags: php回溯算法 php计算组合
- 上一篇:PHP中信息格式化操作详解(MessageFormatter类)
- 下一篇:最后一页
相关文章
- ·PHP基于回溯算法解决n皇后问题的方法示例(2021-08-18)
推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
- PHP新手上路(一)(7)
- 惹恼程序员的十件事(5)
- PHP邮件发送例子,已测试成功(5)
- 致初学者:PHP比ASP优秀的七个理由(4)
- PHP会被淘汰吗?(4)
- PHP新手上路(四)(4)
- 如何去学习PHP?(2)
- 简单入门级php分页代码(2)
- php中邮箱email 电话等格式的验证(2)