回溯算法-golang

步骤

从下标0开始,一直往后走,每一次都有 len(candidates) - i 种选择,当数组总和等于目标时说明符合,当数组总和大于目标时,说明此路不通,终止

图解

在这里插入图片描述

代码

func main() {
	var temp []int  // 中间变量
	candidates := []int{1,2,4} // 需要组合的数据
	var ret [][]int // 结果存放
	target := 4 // 目标
	backTrack(0,temp,target,candidates, &ret)
}

func backTrack(start int, temp []int, target int, candidates []int, result *[][]int) {

	//当target==0说明刚好给出的列表里的存在元素相加等于target
	if target < 0 {
		return
	} else if target == 0 {
		current := make([]int, len(temp))
		copy(current, temp)
		*result = append(*result, current)
	}

	//进行主体循环
	for i := start; i < len(candidates); i++ {
		temp = append(temp, candidates[i])
		//递归
		backTrack(i, temp, target-candidates[i], candidates, result)
		//回溯
		temp = temp[:len(temp)-1]
	}
}

输出结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值