关于回溯法的idea

本文探讨了回溯法的本质,将其比喻为状态树的先序遍历。通过子集树和排列树的概念解释了解空间。举例说明如何用回溯法解决寻找整型数组中和为10的子集问题,并给出了相应的子集树算法程式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

回溯法:实质先序遍历一个“状态树”的过程。回溯法:子集树与排列树

子集树:当所给问题是从含有n个元素的集合S中找出满足某种性质的子集,解空间是子集树。

排列树当所给问题是从n个元素的集合S中找出满足某种性质的排列时,解空间为排列树。


现有整型数组{1,2,4,3,5,8},写出一个函数,找出所有和为10的集合。(回溯法:子集树)

子集树算法程式:

void backtrack(int i, int n)
{
if (i > n)
output();
else
{
for (int i = 0; i <= 1; ++i)
{
取第i个元素; backtrack((i+1, n);
舍第i个元素: backtrack(i+1, n);
}
}
}

public class Test
{
	static int x[] = new int[100];
	public static void main(String args[])
	{
	    int s[] = {1,2,3,4,5,6,7};
	    subSet(0,7,10,s);
	}
	
	public static void output(int a[], int n)
	{
		for (int i = 0; i < n; ++i){
			if (a[i] != 0)
				System.out.print(x[i] + " ");
			
		}
		System.out.println();
	}
	
	public static void subSet(int k, int n, int sum, int a[])
	{
		if (k == n)
		{
			if (sum == 0)
			{
				output(a, n);
			}
			return ;
		}
		for (int i =0; i <= 1; ++i)
		{
			x[k] = i;
			sum -= a[k] * x[k];
			subSet(k+1, n, sum, a);
		}
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值