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

2025-05-27 0 86

给定一个数组 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

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 php回溯算法计算组合总和的实例代码 https://www.kuaiidc.com/69897.html

相关文章

发表评论
暂无评论