给定一个数组 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]]
解题思路
直接参考回溯算法团灭排列/组合/子集问题。
代码
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
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 );
}}
|
实例扩展:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
|
<?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回溯算法计算组合总和的方法内容请搜索快网idc以前的文章或继续浏览下面的相关文章希望大家以后多多支持快网idc!
原文链接:https://www.py.cn/php/jiaocheng/31574.html
相关文章
猜你喜欢
- 个人网站服务器域名解析设置指南:从购买到绑定全流程 2025-06-10
- 个人网站搭建:如何挑选具有弹性扩展能力的服务器? 2025-06-10
- 个人服务器网站搭建:如何选择适合自己的建站程序或框架? 2025-06-10
- 64M VPS建站:能否支持高流量网站运行? 2025-06-10
- 64M VPS建站:怎样选择合适的域名和SSL证书? 2025-06-10
TA的动态
- 2025-07-10 怎样使用阿里云的安全工具进行服务器漏洞扫描和修复?
- 2025-07-10 怎样使用命令行工具优化Linux云服务器的Ping性能?
- 2025-07-10 怎样使用Xshell连接华为云服务器,实现高效远程管理?
- 2025-07-10 怎样利用云服务器D盘搭建稳定、高效的网站托管环境?
- 2025-07-10 怎样使用阿里云的安全组功能来增强服务器防火墙的安全性?
快网idc优惠网
QQ交流群
您的支持,是我们最大的动力!
热门文章
-
2025-05-29 101
-
Linux 下安装 memcached 及 memcacheq的方法
2025-05-27 74 -
2025-05-29 70
-
2025-05-25 91
-
2025-05-25 102
热门评论